Cod sursa(job #409943)

Utilizator bixcabc abc bixc Data 3 martie 2010 22:31:07
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
using namespace std;

#define Nmax 1010

int n, m, maxflow;
int F[Nmax][Nmax], T[Nmax], Q[Nmax];
vector <int> G[Nmax];

void citire () {
	
	int x, y, z, i;
	
	scanf ("%d %d", &n, &m);
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d", &x, &y, &z);
		G[x].push_back (y); G[y].push_back (x);
		F[x][y] = z;
	}
}

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

void flux () {
	
	int i, fiu, Min, x;
	while (BFS()) {
		
		for (i = 0; i < (int)G[n].size (); i++) {
			fiu = G[n][i]; Min = F[fiu][n];
			
			if (T[fiu]) {
				for (x = fiu; x != 1; x = T[x])
					if (F[T[x]][x] < Min) Min = F[T[x]][x];
				
				maxflow+= Min;
				for (x = fiu; x != 1; x = T[x]) {
					F[T[x]][x]-= Min;
					F[x][T[x]]+= Min;
				}
				
				F[fiu][n]-= Min;
				F[n][fiu]+= Min;
			}
		}
	}
}

int main () {

	freopen ("maxflow.in", "r", stdin);
	freopen ("maxflow.out", "w", stdout);

	citire ();
	flux ();
	
	printf ("%d", maxflow);
	
	return 0;
}