Cod sursa(job #309098)

Utilizator tibiletsKoos Tiberiu Iosif tibilets Data 29 aprilie 2009 17:36:33
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<fstream.h>
int cap[1001][1001],fx[1001][1001],fluxm,z;
short x,y,q[1001],s[1001],t[1001],N,M;
int min(int x,int y){return x<y?x:y;}
struct nod
{short inf;nod* adr;}*G[1001];//listele de adiacenta ale grafului
void push(nod *&l,int x)
{nod *p=new nod;p->inf=x;p->adr=l;l=p;}
short bfs()
{short l=1,i;//l - lungimea cozii
 q[1]=1;//coada pentru bfs
 memset(s,0,sizeof(s));s[1] = 1;//vizitat
 for(i=1;i<=l;++i)
  if(q[i]!=N)
   for(nod*p=G[q[i]];p;p=p->adr) 
    if(cap[q[i]][p->inf]!=fx[q[i]][p->inf]&&!s[p->inf])
	{s[p->inf]=1;
	 q[++l]=p->inf;
	  t[p->inf]=q[i];}//t - tata, vector pentru memorarea drumului
 return s[N];}
int main()
{ifstream f("maxflow.in");ofstream g("maxflow.out");
f>>N>>M;
while(M--)
{f>>x>>y>>z;
 cap[x][y]=z;//capacitatea muchiei
 push(G[x],y);
 push(G[y],x);}
 while(bfs())
  for(nod *p=G[N];p;p=p->adr)
   if(fx[p->inf][N]!=cap[p->inf][N]&&s[p->inf])
   {t[N]=p->inf;
	int fm=999999999;
	for(x=N;x!=1;x=t[x]) 
	 fm=min(fm,cap[t[x]][x]-fx[t[x]][x]);
	 if(fm)
	  for(x=N;x!=1;x=t[x])
	  {fx[t[x]][x]+=fm;
	   fx[x][t[x]]-=fm;}
	fluxm+=fm;}
g<<fluxm;
return 0;
}