Cod sursa(job #380362)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 5 ianuarie 2010 21:14:11
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream.h>



struct nod { int info; nod * next;} ;

int suma,k,u,n,m,sw[1007],smax,min,C[1007],cap[1005][1005],flux[1005][1005],viz[1005],t[1005],inf=1000000000;

nod *v[1007],*p;

int max()
{
	int i;
	k=u=1;
	C[k]=1;
	memset(viz,0,sizeof(viz));
	memset(sw,0,sizeof(sw));
	viz[1]=1;
	t[1]=0;
	while (k<=u )
	{
		for (p=v[C[k]];p;p=p->next)
			if ((viz[p->info]==0) && (cap[C[k]][p->info]-flux[C[k]][p->info]>0))
			{
				if (p->info!=n)
				{
					t[p->info]=C[k];
					C[++u]=p->info;
					viz[p->info]=1;
				}
				else sw[C[k]]=1;
			}
		k++;
	}
	suma=0;
	for (i=1;i<=n;i++)
	if (sw[i]==1)
	{
		smax=inf;k=u=n;
		t[n]=i;
		while(t[u]>0)
		{
			min=cap[t[u]][u]-flux[t[u]][u];
			if (min<smax) smax=min;
			u=t[u];
		}
		while(t[k]>0)
		{
			flux[t[k]][k]+=smax;
			flux[k][t[k]]-=smax;
			k=t[k];
		}
		if (smax<inf) suma+=smax;
	}
	return suma;
}
int maxflow()
{
	int s=0,x=1;
	while (x)
	{
		x=max();
		s+=x;
	}
	return s;
}

void citire()
{
	int i,x1,x2,x3;
	nod *p;
	ifstream f("maxflow.in");
	f>>n>>m;
	for (i=1;i<=m;i++)
	{
		f>>x1>>x2>>x3;
		p=new nod;
		p->info=x2;
		p->next=v[x1];
		v[x1]=p;
		cap[x1][x2]=x3;
		p=new nod;
		p->info=x1;
		p->next=v[x2];
		v[x2]=p;
	}
	f.close();
}

int main()
{
	citire();
	ofstream g("maxflow.out");
	g<<maxflow();
	g.close();
	return 0;
}