Cod sursa(job #276604)

Utilizator dan_10Dan Alexandru dan_10 Data 11 martie 2009 11:30:42
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<fstream.h>

ifstream f("maxflow.in");
ofstream g("maxflow.out");

long n,m,a[1005][1005],v[1005][1005];
long fm,x[1005][3],q[1005],t[1005],gasit;

void citire()
{	f>>n>>m;
	int i,j,k;
	for(int p=1;p<=m;p++)
	{	f>>i>>j>>k;
		a[i][j]=k;
		v[i][0]++;
		v[i][v[i][0]]=j;
	}

	f.close();
}

void flux()
{	int i,j,s,d,u,min=32000;

	do{ gasit=0;
	    for(i=1;i<=n;i++)
		{	q[i]=0;
			t[i]=0;
		}
		s=d=1;
		q[1]=1;
		t[1]=-1;
		while(s<=d)
		{	for(int i=1;i<=v[q[s]][0];i++)
			{	j=v[q[s]][i];
				if(t[j]==0 && a[q[s]][j]>0)
					{	d++;
						q[d]=j;
						t[j]=q[s];
						if(j==n) gasit=1;
					}
			}
			s++;
		}
		if(gasit){	int k=0;
				u=n;
				while(u!=1) { k++;
					      x[k][1]=t[u];
					      x[k][2]=u;
					      if(min>a[t[u]][u]) min=a[t[u]][u];
					      u=t[u];
					    }
				fm+=min;
				for(i=1;i<=k;i++)
					{ int b=x[i][1];
					  int c=x[i][2];
					      a[b][c]-=min;
					}
			}
	    }while(gasit);
}


int main()
{	citire();
	flux();

	g<<fm;
	g.close();
	return 0;
}