Cod sursa(job #369021)

Utilizator adelinasAdelina Spataru adelinas Data 26 noiembrie 2009 21:16:24
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 1010
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
#define INF 2000000000
vector<int> V[NMAX];
queue<int> q;
int F[NMAX][NMAX], T[NMAX], C[NMAX][NMAX], viz[NMAX];
int n, m;
int min(int x,int y){
	if(x>y) return y;
	return x;
}
int BFS(){
	memset(viz, 0, sizeof(viz));
	viz[1]=1;
	q.push(1);
	while(!q.empty()){
		int nod = q.front();
		q.pop();
		if(nod == n) continue;
		FOR(i, V[nod]){
			if(viz[*i] || C[nod][*i] == F[nod][*i]) continue;
			C[*i][nod]=0;
			viz[*i] = 1;
			T[*i] = nod;
			q.push(*i);
		}
	}
	return viz[n];
}
int main(){
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= m; ++i){
		int x, y, z;
		scanf("%d %d %d", &x, &y, &z);
		C[x][y]=z;
		//C[y][x]=z;
		V[x].push_back(y);
		V[y].push_back(x);
	}
	
	int flow, flowmin;
	for( flow = 0; BFS();)
		FOR(i, V[n]){
			if(C[*i][n] == F[*i][n]) continue;
			flowmin = INF;
			T[n] = *i;
			for(int j = n; j != 1; j=T[j])
				flowmin = min( flowmin, C[ T[j] ][j] - F[ T[j] ][j]);
			if(flowmin == 0) continue;
			for(int j = n; j != 1; j=T[j]){
				F[  T[j] ][j] += flowmin;
				F[j][ T[j] ]  -= flowmin;
			}
			flow += flowmin;
		}
	printf("%d\n",flow);
	return 0;
}