Cod sursa(job #256490)

Utilizator luk17Luca Bogdan luk17 Data 11 februarie 2009 20:21:24
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#define NMAX 1001
#define MMAX 5001
#define min(a,b) a<b? a:b
int e[NMAX][NMAX],c[NMAX][NMAX],f[NMAX][NMAX],source,sink,n,m,flow,maxflow=0,p[NMAX];;
void citire()
{
	int x,y,z,i;
	freopen("maxflow.in","r",stdin);	
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		c[x][y]=z;
	}
	/*for(i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			printf("%d ",c[i][j]);
		printf("\n");
	}*/
}
int BFS(int source)
{
	int q[NMAX],pr,ul,i,k;
	for(i=1;i<=n;i++)
		p[i]=-1;
	pr=ul=1;
	flow=32000;
	q[1]=source;
	p[source]=0;
	while(pr<=ul)
	{
		k=q[pr++];
		for(i=1;i<=n;i++)
			if(c[k][i]&&p[i]==-1&&c[k][i]-f[k][i]>0)
			{
				flow=min(flow,c[k][i]-f[k][i]);
				p[i]=k;
				if(i==sink)return flow;
				q[++ul]=i;
			}
	}
return 0;
}
int EdmondsKarp()
{
	flow=BFS(source);
	while(flow)
	{
		int v=sink,u;
		maxflow+=flow;
		while(v!=source)
		{
			u=p[v];
			f[u][v]+=flow;
			f[v][u]-=flow;
			v=u;
		}

		flow=BFS(source);
	}
	return maxflow;
}
int main()
{
	citire();
	source=1;
	sink=n;
	freopen("maxflow.out","w",stdout);
	printf("%d",EdmondsKarp());
	return 0;
}