Cod sursa(job #412512)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 5 martie 2010 19:39:56
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>
#include <cstring>

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

#define Nmax 1010

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

int bfs()
{
	memset(viz,0,sizeof(viz));
	
	int q[Nmax];
	int p,u;
	q[1]=1;
	p=u=1;
	viz[1]=-1;
	
	while(p<=u)
	{
		int nod=q[p++];
		
		for (int 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;
}

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

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;
}


int main()
{
	int a,b,c;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &m);
	
	while(m--)
	{
		scanf("%d %d %d", &a, &b, &c);
		
		C[a][b]=c;
	}
	
	
	printf("%d\n", flow());
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}