Nu aveti permisiuni pentru a descarca fisierul grader_test5.ok

Cod sursa(job #276611)

Utilizator vladbBogolin Vlad vladb Data 11 martie 2009 11:32:26
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream.h>

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const long max=1000000;
long a[1000][1000],V[1000][1000],n;
long fm,i,j,s,m,d,x[1000][30],Q[1000],p[1000],t[1000],gasit,v;

int main()
{   int e,f,g;
	fin>>n>>m;
	while(fin>>e>>f>>g)
	{	a[e][f]=g;
		V[e][0]++;
		V[e][V[e][0]]=f;
	}
	do { gasit=0;
		 for(i=1;i<=n;i++)
		 {	Q[i]=0;
			p[i]=0;
			t[i]=0;
		 }
		 s=d=1;
		 p[1]=1;
		 Q[1]=1;
		 while(s<=d)
		 {	for(i=1;i<=V[Q[s]][0];i++)
			{ 	int j=V[Q[s]][i];
				if(p[j]==0&&a[Q[s]][j]>0)
				{	d++;
					Q[d]=j;
					p[j]=1;
					t[j]=Q[s];
					if(j==n) gasit=1;
				}
			}
			s++;
		 }
		 if(gasit)
		 {	int k=0;
			v=n;
			while(v!=1)
			{	k++;
				x[k][1]=t[v];
				x[k][2]=v;
				v=t[v];
			}
			int min=max;
			for(i=1;i<=k;i++)
				if(min>a[x[i][1]][x[i][2]])
					min=a[x[i][1]][x[i][2]];
			fm+=min;
			for(i=1;i<=k;i++)
			{	int b=x[i][1];
				int c=x[i][2];
				a[b][c]=a[b][c]-min;
				a[c][b]+=min;
			}
		 }
	}while(gasit);
	fout<<fm;
	fin.close();
	fout.close();
	return 0;
}