Cod sursa(job #721348)

Utilizator ILDottoreBogdan Stoian ILDottore Data 23 martie 2012 17:19:49
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<cstdio>
#include<vector>
using namespace std;

#define NMAX 1005
#define INF 2000000000

FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");

long C[NMAX][NMAX],maxflow,F[NMAX][NMAX],viz[NMAX],T[NMAX],coada[NMAX];

int n,m;

vector<int> L[NMAX];


int BF()
{   long vf=0;

	memset(viz,0,sizeof(viz) );
	viz[1]=1;
	vf++;
    coada[vf]=1;
	
	for (int i=1;i<=vf;i++)
	   {
		   if (coada[i]==n) 
			   continue;
		   
		   for (int j=0;j<L[ coada[i] ].size();j++)
			   if (!viz[ L[coada[i]][j] ] && C[coada[i]][ L[coada[i]][j] ] != F[coada[i]][ L[coada[i]][j] ])
			        { vf++;
					   coada[vf]=L[coada[i]][j];
					   viz[L[coada[i]][j]]=1;
					   T[L[coada[i]][j]]=coada[i];
					}
		}
	
	return viz[n];
}
	          

int main()
{
	fscanf(f,"%d%d",&n,&m);
	
	for (int k=1;k<=m;k++)
	{ int x,y;
	  long z;
	fscanf(f,"%d%d%ld",&x,&y,&z);
	L[x].push_back(y);
	L[y].push_back(x);
	
	C[x][y]=z;
	}
	
	while ( BF() )
	   for (int i=0;i<L[n].size();i++)
		   {
			   if (F[ L[n][i] ][n]==C[ L[n][i] ][n] || !viz[ L[n][i] ] ) 
				   continue;
			   
			   T[n]=L[n][i];
			   int j=n;
			   long minim=INF;
			      while(j!=1)
				     {   if ( C[T[j] ][ j ] - F[T[j]][j] < minim)
								 minim= C[T[j] ][j] - F[T[j]][ j ];
					 j=T[j];
					 }
				j=n;	
				
				  while(j!=1)
				  {   F[ T[j] ][ j ]+=minim;
				      F[ j ] [T[j]] -=minim;
					  j=T[j];
				  }
		 maxflow+=minim;  
	    }
	   
	fprintf(g,"%ld\n",maxflow);
return 0;}