Cod sursa(job #433934)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 4 aprilie 2010 18:44:02
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>
#include<vector>
#include<string.h>

using namespace std;

#define pb push_back
#define N 1010
#define INF 0x3f3f3f3f


vector<int> a[N];
int n, m, flux, f[N][N], tata[N], q[N];

void citire(){
int i, x, y, z;
	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);
		f[x][y] = z; 
	}
}

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

void rezolva(){
int i, j, minim;
	while (bfs()){
		for (i = 0; i < a[n].size(); ++i)
			if (tata[a[n][i]] && f[a[n][i]][n] > 0){
				minim = f[a[n][i]][n];
				for (j = a[n][i]; j != 1; j = tata[j])
					if (f[tata[j]][j] < minim)
						minim = f[tata[j]][j];
					
				f[a[n][i]][n] -= minim; f[n][a[n][i]] += minim;
				
				for (j = a[n][i]; j != 1; j = tata[j])
					f[tata[j]][j] -= minim, f[j][tata[j]] += minim;
				flux += minim;
			}
	}
}

int main(){
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	citire();
	rezolva();
	printf("%d\n", flux);
	
	return 0;
}