Cod sursa(job #489934)

Utilizator Addy.Adrian Draghici Addy. Data 4 octombrie 2010 09:13:08
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define NMAX 1005
#define MMAX 10005

struct {
	int x, y;
} M[MMAX];

int C[NMAX][NMAX], F[NMAX][NMAX], Q[NMAX], T[NMAX], S[NMAX], D[NMAX], viz[NMAX], sol[MMAX], n, m, nr_sol;
vector <int> G[NMAX];

int BFS ();
void citire (), flux (), critice (), afisare ();

int main () {
	
	citire ();
	
	flux ();
	
	critice ();
	
	afisare ();
	
	return 0;
}

void citire () {
	
	freopen ("critice.in", "r", stdin);
	
	int i, x, y, c;
	
	scanf ("%d %d", &n, &m);
	
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d", &x, &y, &c);
		M[i].x = x, M[i].y = y;
		G[x].push_back (y);
		G[y].push_back (x);
		C[x][y] = C[y][x] = c;
	}
}

int BFS () {
	
	int p, u, i, nod, fiu, ok = 0;
	
	memset (viz, 0, sizeof (viz));
	
	Q[1] = 1, viz[1] = 1, T[1] = 0;
	for (p = u = 1; p <= u; p++) {
		nod = Q[p];
		for (i = 0; i < (int) G[nod].size (); i++) {
			fiu = G[nod][i];
			if (!viz[fiu] && C[nod][fiu] > F[nod][fiu]) {
				if (fiu == n) {
					ok = 1; continue;
				}
				
				Q[++u] = fiu;
				viz[fiu] = 1, T[fiu] = nod;
			}
		}
	}
	
	return ok;
}

void flux () {
	
	int i, fr, nod, minim;
	
	while (BFS ())
		for (i = 0; i < (int) G[n].size (); i++) {
			fr = G[n][i];
			
			minim = C[fr][n] - F[fr][n];
			
			for (nod = fr; T[nod]; nod = T[nod])
				minim = min (minim, C[T[nod]][nod] - F[T[nod]][nod]);
			
			for (T[n] = fr, nod = n; T[nod]; nod = T[nod]) {
				F[T[nod]][nod] += minim;
				F[nod][T[nod]] -= minim;
			}
		}
}

void critice () {
	
	int i, p, u, nod, fiu;
	
	Q[1] = 1, D[1] = 1;
	for (p = u = 1; p <= u; p++) {
		nod = Q[p];
		for (i = 0; i < (int) G[nod].size (); i++) {
			fiu = G[nod][i];
			if (!D[fiu] && C[nod][fiu] > abs (F[nod][fiu])) {
				Q[++u] = fiu;
				D[fiu] = 1;
			}
		}
	}
	
	Q[1] = n, S[n] = 1;
	for (p = u = 1; p <= u; p++) {
		nod = Q[p];
		for (i = 0; i < (int) G[nod].size (); i++) {
			fiu = G[nod][i];
			if (!S[fiu] && C[nod][fiu] > abs (F[nod][fiu])) {
				Q[++u] = fiu;
				S[fiu] = 1;
			}
		}
	}
}

void afisare () {
	
	freopen ("critice.out", "w", stdout);
	
	int i, x, y;
	
	for (i = 1; i <= m; i++) {
		x = M[i].x, y = M[i].y;
		if ((D[x] && S[y]) || (D[y] && S[x]) && C[x][y] == abs (F[x][y]))
			sol[++nr_sol] = i;
	}
	
	printf ("%d\n", nr_sol);
	for (i = 1; i <= nr_sol; i++)
		printf ("%d\n", sol[i]);
}