Cod sursa(job #419322)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 17 martie 2010 12:01:27
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<stdio.h>
#include<string.h>
#define Nmax 1010
struct nod
{
	int inf;
	nod *urm;
}*a[Nmax];
int c[Nmax][Nmax],f[Nmax][Nmax],n,m,ft,t[Nmax],viz[Nmax];
void citire()
{
	int x,y,co;
	nod *p;
	scanf("%d %d",&n,&m);
	for(int i=0;i<m;i++)
	{
		scanf("%d %d %d",&x,&y,&co);
		p=new nod;
		p->inf=y;
		p->urm=a[x];
		a[x]=p;
		c[x][y]=co;
		p=new nod;
		p->inf=x;
		p->urm=a[y];
		a[y]=p;
	}
}

int coada()
{
	int q[Nmax],pr=1,u=1;
	memset(viz,0,sizeof(viz));
	q[1]=1;
	viz[1]=1;
	nod *p;
	while(pr<=u )
	{
	if(q[pr]!=n)
		for(p=a[q[pr]];p!=NULL;p=p->urm)
		{
			if(viz[p->inf]==0 && c[q[pr]][p->inf]-f[q[pr]][p->inf]>0)
			{
				viz[p->inf]=1;
				u++;
				q[u]=p->inf;
				t[p->inf]=q[pr];
			}
		}
	pr++;
	}
	return viz[n];
}
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	citire();
	nod *p;
	int min;
	while(coada())
	{
		for(p=a[n];p!=NULL;p=p->urm)
		{
			if(c[p->inf][n]-f[p->inf][n]>0 && viz[p->inf]==1)
			{
				int aj;
				aj=p->inf;
				min=c[p->inf][n]-f[p->inf][n];
				while(aj!=1)
				{
					if(min>c[t[aj]][aj]-f[t[aj]][aj])
						min=c[t[aj]][aj]-f[t[aj]][aj];
				aj=t[aj];
				}
				if(min==0) continue;
				f[p->inf][n]+=min;
				f[n][p->inf]-=min;
				aj=p->inf;
				while(aj!=1)
				{	
					f[t[aj]][aj]+=min;
					f[aj][t[aj]]-=min;
					aj=t[aj];
				}
				ft+=min;
			}
		}
	}
	
	printf("%d\n",ft);
	return 0;
}