Cod sursa(job #387910)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 28 ianuarie 2010 18:44:46
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

#define mp make_pair
#define pb push_back
#define N 1005
#define INF 0x3f3f3f3f

using namespace std;

int n, m, x, y, z, i, j, c[N][N], tata[N], q[N], ok, it, flux, minim, w;
vector< int > a[N];


int bfs(){
	q[0] = 1; ok = 0;
	memset(tata, 0, sizeof(tata));
	
	for (int p = 0, u = 0; p <= u; p++){
		x = q[p];
		for (it = 0; it < a[x].size(); it++){
			if (!tata[a[x][it]] && c[x][a[x][it]] > 0){
				tata[a[x][it]] = x;
				if (a[x][it] != n)	q[++u] = a[x][it];
				else	ok = 1; 
			}
		}
	}
	return ok;
}

int main(){
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d", &n, &m);
	
	for (i = 1; i <= m; i++){
		scanf("%d %d %d", &x, &y, &z);
		a[x].pb(y);
		a[y].pb(x);
		c[x][y] = z;
	}
	
	flux = 0;
	while (bfs()){
		minim = INF;
		for (w = 0; w < a[n].size(); w++){
			if (tata[a[n][w]]){
				minim = c[a[n][w]][n];
				
				for (i = a[n][w]; i != 1; i = tata[i])
					if (c[tata[i]][i] < minim) minim = c[tata[i]][i];
				
				c[a[n][w]][n] -= minim; c[n][a[n][w]] += minim;
				
				for (i = a[n][w]; i != 1; i = tata[i])
					c[tata[i]][i] -= minim, c[i][tata[i]] += minim;
			
				flux += minim;
			}
		}
	}
	printf("%d\n", flux);
	
	return 0;
}