Cod sursa(job #381069)

Utilizator katakunaCazacu Alexandru katakuna Data 8 ianuarie 2010 19:00:53
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

#define Nmax 1024

void citire (), rezolvare (), afisare ();
int n, m, maxflow;
int viz[Nmax], Q[Nmax], T[Nmax], C[Nmax][Nmax], F[Nmax][Nmax];
vector <int> V[Nmax];

int main () {

	freopen ("maxflow.in", "r", stdin);
	freopen ("maxflow.out", "w", stdout);
	
	citire ();
	rezolvare ();
	afisare ();
	
	return 0;
}

void citire () {
	
	int a, b, c;
	scanf ("%d %d", &n, &m);
	for (int i = 1; i <= m; i++) {
		scanf ("%d %d %d", &a, &b, &c);
		V[a].push_back (b); C[a][b] = c;
		V[b].push_back (a);
	}
}

int BFS () {
	
	int ok = 0, p, u, nod, i, fiu;
	memset (viz, 0, sizeof (viz));
	viz[1] = 1; Q[1] = 1;
	
	for (p = u = 1; p <= u; p++) {
		nod = Q[p];
		for (i = 0; i < (int)V[nod].size (); i++) {
			fiu = V[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 rezolvare () {
	
	int fr, nod, minim;
	while (BFS ()) {
		
		for (int i = 0; i < (int)V[n].size(); i++) {
			fr = V[n][i];
			if (viz[fr]) {
				minim = C[fr][n] - F[fr][n];
				
				for (nod = fr; nod != 1; nod = T[nod]) 
					minim = min (minim, C[T[nod]][nod] - F[T[nod]][nod]);
				
				if (!minim) continue;
				for (T[n] = fr, nod = n; nod != 1; nod = T[nod]) 
					F[T[nod]][nod]+= minim,
					F[nod][T[nod]]-= minim;
				
				maxflow+= minim;
			}
		}
	}
}

void afisare () {
	printf ("%d", maxflow);
}