Cod sursa(job #462)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 11 decembrie 2006 12:53:06
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

#define PB push_back
#define MP make_pair

const int NMAX = 1024;
const int MMAX = 10240;
const int INF = 0x3f3f3f3f;

int N, M;
vector <pair <int, int> > G[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX];
int Path[NMAX], NP;
int Y[MMAX];

void citire() {
	FILE *fin = fopen("critice.in", "rt");
	int a, b, c;
	int i;

	fscanf(fin, " %d %d", &N, &M);

	for (i = 0; i < M; ++i) {
		fscanf(fin, " %d %d %d", &a, &b, &c);
		--a; --b;
		G[a].PB( MP(b, i) ); G[b].PB( MP(a, i) );
		C[a][b] = c; C[b][a] = c;
	}

	fclose(fin);
}

int bf() {
	int Q[NMAX], NQ, T[NMAX];
	bool V[NMAX];
	int u, v, i, k;
	vector < pair <int, int> > :: iterator j;

	memset(V, 0, sizeof(V));
	memset(T, 0xff, sizeof(T));
	V[0] = true;
	NQ = 1; Q[0] = 0;

	for (i = 0; i < NQ; ++i) {
		u = Q[i];

		for (j = G[u].begin(); j != G[u].end(); ++j) {
			v = j->first;

			if (V[v] == false && C[u][v] > F[u][v]) {
				T[v] = u;
				V[v] = true;
				Q[NQ++] = v;

				if (v + 1 == N) {
					NP = 0;
					k = N - 1;
					while (k != -1)
						Path[NP++] = k,
						k = T[k];
					return 1;
				}
			}
		}
	}
	return 0;
}

void flux_karp() {
	int i, u, v;
	int flow;

	while ( bf() ) {
		flow = INF;

		for (v = Path[NP - 1], i = NP - 2; i >= 0; --i) {
			u = v; v = Path[i];
			flow <?= C[u][v] - F[u][v];
		}

		for (v = Path[NP - 1], i = NP - 2; i >= 0; --i) {
			u = v; v = Path[i];
			F[u][v] += flow;
			F[v][u] -= flow;
		}
	}
}

void critice(int s, int mark) {
	int Q[NMAX], NQ;
	bool V[NMAX];
	int i, u, v;
	unsigned j;

	memset(V, 0, sizeof(V));
	V[s] = true; Q[0] = s; NQ = 1;

	for (i = 0; i < NQ; ++i) {
		u = Q[i];

		for (j = 0; j < G[u].size(); ++j) {
			v = G[u][j].first;

			if (V[v] == false) {
				if ((mark == 1 && C[u][v] == F[u][v]) ||
				    (mark == 2 && C[v][u] == F[v][u]))
					Y[ G[u][j].second ] |= mark;
				else
					Q[NQ++] = v,
					V[v] = true;
			}
		}
	}
}

void afisare() {
	FILE *fout = fopen("critice.out", "wt");
	int i, num = 0;

	for (i = 0; i < M; ++i)
		if (Y[i] == 3) 
			++num;

	fprintf(fout, "%d\n", num);

	for (i = 0; i < M; ++i)
		if (Y[i] == 3)
			fprintf(fout, "%d\n", i + 1);

	fclose(fout);
}

int main() {
	citire();
	flux_karp();
	critice(0, 1);
	critice(N - 1, 2);
	afisare();
	return 0;
}