Cod sursa(job #288065)

Utilizator c_iulyanCretu Iulian c_iulyan Data 25 martie 2009 15:16:19
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb

#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

long n,m,c[1001][1001],d[1001],cd[1001],F,R,v[1001],gata;
vector <long> g[1001];

void rd()
{
scanf("%ld%ld",&n,&m);

for(long i=1;i<=m;i++)
	{
	long x,y,z;
	scanf("%ld%ld%ld",&x,&y,&z);
	g[x].push_back(y);
	g[y].push_back(x);
	c[x][y]+=z;
	}
}

void go(long i)
{
v[i]=1;
cd[1]=i;

long st=1,dr=2;

while(st<dr)
	{
	long u=cd[st];
	
	for(long j=0;j<g[u].size();j++)
		if(c[u][g[u][j]]&&!v[g[u][j]])
			{
			if(g[u][j]==n) continue;
			
			v[g[u][j]]=1;
			cd[dr]=g[u][j];
			d[g[u][j]]=u;
			
			dr++;			
			}
	st++;
	}
}

int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);

rd();

while(!gata)
	{
	gata=1;
	long i;
	for(i=1;i<=n;i++)
		v[i]=cd[i]=0;
		
	go(1);
	
	for(i=0;i<g[n].size();i++)
		if(v[g[n][i]]&&c[g[n][i]][n])
			{
			gata=0;
			long u=g[n][i];
			long R=666666666;
			d[n]=u;
			
			for(u=n;d[u];u=d[u])
				if(c[d[u]][u]<R) R=c[d[u]][u];
				
			for(u=n;d[u];u=d[u])
				{
				c[d[u]][u]-=R;
				c[u][d[u]]+=R;
				}
				
			F+=R;			
			}	
	}

printf("%ld\n",F);
return 0;
}