Cod sursa(job #275677)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 10 martie 2009 16:48:27
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
#include<string.h>
#define MAXN 1005
#define INF 111111
long n,m,s,d,flux,c[MAXN][MAXN],f[MAXN][MAXN],t[MAXN],i,x,y,ca,g[MAXN][MAXN];
long min(long x,long y)
{if(x<y)return x;
return y;}
long BFS(long s,long d)
{long p,u,nod,i,q[MAXN],nn;
 memset(t,0,sizeof(t));
 p=u=0;
 q[p]=s;
 t[s]=-1;
 while(p<=u)
  {nod=q[p];
   for(i=1;i<=g[nod][0];++i)
      {nn=g[nod][i];
       if(!t[nn]&&c[nod][nn]-f[nod][nn]>0)
        {q[++u]=nn;
         t[nn]=nod;
         if(nn==d)return 1;}}
   ++p;}
 return 0;
}
void flux_max()
{long i,cr;
 for(flux=0;BFS(s,d);flux+=cr)
 {cr=INF;
  i=d;
  while(i!=s)
   {//eventual-afisare i(pt. afisarea drumului)
    cr=min(cr,c[t[i]][i]-f[t[i]][i]);
    i=t[i];}
  i=d;
  while(i!=s)
   {f[t[i]][i]+=cr;
    f[i][t[i]]-=cr;
    i=t[i];}
 }
}
int main()
{
 freopen("maxflow.in","r",stdin);
 freopen("maxflow.out","w",stdout);
 scanf("%ld%ld",&n,&m);
 s=1;d=n;
 for(i=1;i<=m;++i)
    {scanf("%ld%ld%ld",&x,&y,&ca);
     c[x][y]=ca;
     g[x][++g[x][0]]=y;
     g[y][++g[y][0]]=x;}
 flux_max();
 printf("%ld\n",flux);
 return 0;
}