Cod sursa(job #751418)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 26 mai 2012 05:53:55
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
FILE *in = freopen("maxflow.in", "r", stdin), *out = freopen("maxflow.out", "w", stdout);

int n, m, C[1001][1001], F[1001][1001], prec[1001], viz[1001];
vector <int> G[1001];
queue <int> q;
	
void BFS(){
	int i, nod, adj;
	for (i = 1; i <= n; i++) prec[i] = -1, viz[i] = 0;
	q.push(1), viz[1] = 1;
	
	while(!q.empty()){
		nod = q.front(), q.pop();
		for (i = 0; i < 
			G[nod].size() && (adj = G[nod][i]); i++)
			if (F[nod][adj] < C[nod][adj] && !viz[adj]){
				q.push(adj);
				viz[adj] = 1;
				prec[adj] = nod;
			}
	}
}

int main(){
	int i, x, y, c, maxflow = 0, nod, aug;
	
	scanf("%d %d", &n, &m);
	for (i = 0; i < m; i++){
		scanf("%d %d %d", &x, &y, &c);
		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y] = c;
	}
	
	do
		for (BFS(), i = 0; i < G[n].size(); i++)
			if (C[G[n][i]][n] != F[G[n][i]][n] && viz[G[n][i]]){
				aug = 0xfffffff;
				prec[n] = G[n][i];
				
				for (nod = n; prec[nod] > -1; ){				//calculez cu cat pot creste fluxul
					aug = min( C[prec[nod]][nod] - F[prec[nod]][nod], aug );
					nod = prec[nod];
				}
				
				if (!aug) continue;
				maxflow += aug;
				for (nod = n; prec[nod] > -1;){				//actualizez cel mai bun flux gasit pana acum
					F[prec[nod]][nod] += aug;
					F[nod][prec[nod]] -= aug;
					nod = prec[nod];
				}
			}
	while (viz[n]);	
		
	printf("%d\n", maxflow);
}