Cod sursa(job #475258)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 6 august 2010 13:47:47
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda flux Marime 1.29 kb
#include <cstdio>
#include <cstring>


#define file_in "maxflow.in"
#define file_out "maxflow.out"

#define nmax 1111

int n,m;
int c[nmax][nmax];
int f[nmax][nmax];
int viz[nmax];

void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	int x,y,z;
	
	scanf("%d %d", &n, &m);
	for (int i=1;i<=m;++i)
	{
		scanf("%d %d %d", &x, &y, &z);
		c[x][y]=z;
	}
}

inline int min(int a, int b) { return a<b?a:b; } 

int bfs()
{
	memset(viz,0,sizeof(viz));
	int q[nmax];
	int p,u,i;
	q[p=u=1]=1;
	viz[1]=-1;
	
	while(p<=u){
		
		int nod=q[p++];
		
		for (i=1;i<=n;++i)
		     if (!viz[i] && c[nod][i]>f[nod][i])
			 {
				 viz[i]=nod;
				 q[++u]=i;
				 if (i==n)
					 return 1;
			 }
	}
	
	return 0;
}

int flow()
{
	int j,v=0,flux=0,i; 
	
	for(;bfs();)
	{
		for (i=1;i<=n;++i)
		{
			if (c[i][n]<=f[i][n] || viz[i]<=0) continue;
			v=c[i][n]-f[i][n];
			for (j=i;j!=1;j=viz[j])
				 v=min(v,c[viz[j]][j]-f[viz[j]][j]);
			if (v==0) continue;
			f[i][n]+=v;
			f[n][i]-=v;
			for (j=i;j!=1;j=viz[j])
				 f[viz[j]][j]+=v,
				 f[j][viz[j]]-=v,
			flux+=v;
		}
	}

	return flux;
}


void solve()
{
	printf("%d\n", flow());
}

int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}