Cod sursa(job #401288)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 22 februarie 2010 18:41:35
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <cstring>

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

#define Nmax 1101

int n,m;
int C[Nmax][Nmax];
int F[Nmax][Nmax];
int viz[Nmax];

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



int bfs()
{
	int p,u,q[Nmax],i,x;
	memset(viz,0,sizeof(viz));
	
	q[1]=1;
	viz[1]=-1;
	
	p=u=1;
	
	while(p<=u)
	{
		x=q[p++];
		
		for (i=1;i<=n;++i)
			 if (!viz[i] && C[x][i]>F[x][i])
			 {
				 viz[i]=x;
				 q[++u]=i;
				 if (i==n) return 1;
			 }
	}
	
	return 0;
	
}

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


int maxflow()
{
	int i,j,v=0,flow=0;
	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[j][viz[j]]-=v,
				 F[viz[j]][j]+=v;
			flow+=v;
        }    
	}
	return flow;
}	


int main()
{
	citire();
	printf("%d\n", maxflow());
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}