Cod sursa(job #392150)

Utilizator ConsstantinTabacu Raul Consstantin Data 6 februarie 2010 20:36:06
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>
#include<vector>
#include<string.h>
#include<queue>
using namespace std;

vector<int> v[ 1010 ];
int q[ 1010 ];

int n,m,i,j,t[ 1010 ],a,b,C,c[1010 ][ 1010 ],minflow,sol;

bool bf(){
int p = 1,x,i,N,u = 1;

q[1] = 1;

memset(t,0,sizeof(t));
t[1] = -1;
while(p<=u){
	x = q[p];
	N = v[x].size();
	for(i = 0 ; i < N ; i++)
		if(!t[v[x][i]] && c[x][v[x][i]])
		{u++;
		t[v[x][i]] = x;
		q[u]=v[x][i];
		if(q[u] == n)return true;
		}
p++;
}
return false;
}

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",&a,&b,&C);
	v[b].push_back(a);
	v[a].push_back(b);
	c[a][b] = C;
	}
	
	while(bf()){
	minflow = 1 << 30;
	for(i = n ; t[i] != -1;i=t[i])
		if(c[t[i]][i] < minflow)
			minflow = c[t[i]][i];
	sol += minflow;
	
	for(i = n ; t[i] != -1;i = t[i])
		{c[i][t[i]] += minflow;
		c[t[i]][i] -= minflow;
		}
	}
	
printf("%d",sol);
return 0;}