Cod sursa(job #389635)

Utilizator GotenAmza Catalin Goten Data 1 februarie 2010 22:44:15
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream.h>

int leg[10100],ver[10100],start[1100],c[1100][1100],x,y,viz[1100],q[1100],m,n,padre[1100],k,add,flou;

int bfs()
{
	int u=1,p=1,t,i;
	for(i=1;i<=n;i++)
		viz[i]=0;
	q[u]=1;
	viz[1]=1;
	while(p<=u)
	{
		if(q[p]!=n)
		{
			t=start[q[p]];
			while(t)
			{
				if(!viz[ver[t]]&&c[q[p]][ver[t]])
				{	
					viz[ver[t]]++;
					q[++u]=ver[t];
					padre[ver[t]]=q[p];
				}
				t=leg[t];
			}
		}
		p++;
	}
	return viz[n];
}

int main()
{
	int i,tt,t;
	ifstream f("maxflow.in");
	ofstream g("maxflow.out");
	f>>n>>m;
	for(i=1;i<=m;i++)
	{
		f>>x>>y>>c[x][y];
		ver[++k]=y;
		leg[k]=start[x];
		start[x]=k;
		ver[++k]=x;
		leg[k]=start[y];
		start[y]=k;
	}
	while(bfs())
	{
		t=start[n];
		while(t)
		{
			if(viz[ver[t]]&&c[ver[t]][n])
			{
				padre[n]=ver[t];
				add=(1<<30);
				tt=n;
				while(padre[tt])
				{
					if(add>c[padre[tt]][tt])
						add=c[padre[tt]][tt];
					tt=padre[tt];
				}
				tt=n;
				if(add)
					while(padre[tt])
					{
						c[padre[tt]][tt]-=add;
						c[tt][padre[tt]]+=add;
						tt=padre[tt];
					}
				flou+=add;
			}
			t=leg[t];
		}
	}
	g<<flou;
	return 0;
}