Cod sursa(job #475287)

Utilizator cosmyoPaunel Cosmin cosmyo Data 6 august 2010 14:32:35
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream.h>
#define NMAX 1005
#include<queue>
#define inf 120000
using namespace std;
queue<long> q;
long flux,s,d,m,c[NMAX][NMAX],n,f[NMAX][NMAX],t[NMAX];
void cit()
{ifstream fin("maxflow.in");
	fin>>n>>m;
	long i,x,y,ct,nrs,nrd;
	for(i=1;i<=m;++i)
		{fin>>x>>y>>ct;c[x][y]=ct;}
	for(x=1;x<=n;++x)
	{nrs=0;
	 nrd=0;
	  for(y=1;y<=n;++y)
		  if(c[y][x])
			  ++nrs;
		  else
			  if(c[x][y])
				  ++nrd;
	 if(nrs==0)
		 s=x;
	 if(nrd==0)
		 d=x;
	}
	fin.close();
}
long bfs()
{long i,j,k;
 while(!q.empty())
	 q.pop();
 q.push(s);
 for(i=1;i<=n;++i)
	 t[i]=0;
 while(!q.empty())
	 {k=q.front();
       for(i=1;i<=n;++i)
		   if(f[k][i]<c[k][i]&&t[i]==0)
		   {q.push(i);
		    t[i]=k;
		    if(i==d)
				return 1;
		   }
	 q.pop();
	 }
 return 0;
}
ofstream fout("maxflow.out");
long min(long a,long b)
{return (a)<(b)?(a):(b);}
void flux_maxim()
{long i,j,r;
  for(;bfs();flux+=r)
  {r=inf;
   i=d;
    while(i!=s)
		{r=min(r,c[t[i]][i]-f[t[i]][i]);
		 i=t[i];
		}
  i=d;
   while(i!=s)
	   {f[t[i]][i]+=r;
        f[i][t[i]]-=r;
		i=t[i];
	   }
  }
}
void afis()
{
	 fout<<flux<<'\n';
 fout.close();
}
int main()
{cit();
 flux_maxim();
 afis();
 return 0;
}