Cod sursa(job #265116)

Utilizator ZillaMathe Bogdan Zilla Data 23 februarie 2009 13:12:17
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>

#define Nmax 1024

int t[Nmax],n,m,viz[Nmax],coada[Nmax],flux,C[Nmax][Nmax],F[Nmax][Nmax];

int bf()
{
	int st,dr,nod,i;
	for(i=1;i<=n;++i)
		viz[i]=0;
	st=1;dr=1;
	coada[1]=1;
	while(st<=dr)
		{
			nod=coada[st++];
			for(i=1;i<=n;++i)
				if(C[nod][i]-F[nod][i]>0 && viz[i]==0)
					{
						viz[i]=1;
						t[i]=nod;
						coada[++dr]=i;
					}
		}
	return(viz[n]);
}

int main()
{
	int x,y,c,min,i,j;
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;++i)
		{
			scanf("%d%d%d",&x,&y,&c);
			C[x][y]=c;
		}

	while(bf())
	for(j=1;j<=n;++j)
	if(C[j][n]-F[j][n]>0)
		{
			min=C[j][n]-F[j][n];
			for(i=j;i!=1;i=t[i])
				if(C[t[i]][i]-F[t[i]][i]<min)
					min=C[t[i]][i]-F[t[i]][i];
			for(i=j;i!=1;i=t[i])
				{
					F[t[i]][i]+=min;
					F[i][t[i]]-=min;
				}
			F[j][n]+=min;
			F[n][j]-=min;
			flux+=min;
		}
	printf("%d\n",flux);

	return 0;
}