Cod sursa(job #464937)

Utilizator ionutz32Ilie Ionut ionutz32 Data 22 iunie 2010 16:52:39
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
struct nod
{
	int nr;
	nod *adr;
} *graf[1005],*u;
int n,m,x,y,z,c[1005][1005],f[1005][1005],q[1005],st,dr,s[1005],t[1005],min,sol,i,j;
bool k;
int main()
{
	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,&z);
		c[x][y]=z;
		u=new nod;
		u->nr=y;
		u->adr=graf[x];
		graf[x]=u;
		u=new nod;
		u->nr=x;
		u->adr=graf[y];
		graf[y]=u;
	}
	k=true;
	while (k)
	{
		k=false;
		q[1]=1;
		st=1;
		dr=1;
		for (i=2;i<=n;++i)
			s[i]=0;
		s[1]=1;
		while (st<=dr)
		{
			if (q[st]==n)
				k=true;
			else
				for (u=graf[q[st]];u;u=u->adr)
					if (c[q[st]][u->nr]>f[q[st]][u->nr] && !s[u->nr])
					{
						s[u->nr]=1;
						q[++dr]=u->nr;
						t[u->nr]=q[st];
					}
			++st;
		}
		if (k)
			for (u=graf[n];u;u=u->adr)
				if (s[u->nr] && c[u->nr][n]>f[u->nr][n])
				{
					min=c[u->nr][n]-f[u->nr][n];
					for (i=u->nr;i!=1;i=t[i])
						if (c[t[i]][i]-f[t[i]][i]<min)
							min=c[t[i]][i]-f[t[i]][i];
					if (min>0)
					{	
						t[n]=u->nr;
						for (i=n;i!=1;i=t[i])
						{
							f[t[i]][i]+=min;
							f[i][t[i]]-=min;
						}
						sol+=min;
					}
				}
	}
	printf("%d",sol);
	return 0;
}