Cod sursa(job #281251)

Utilizator igsifvevc avb igsi Data 13 martie 2009 22:56:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream.h>

#define xx 1002

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

int n,m,c[xx][xx],f[xx][xx],t[xx],flux;

inline int min(int a,int b)
{ return (a<b ? a : b); }

int bf(int s,int d)
{
    int li,ls,q[xx],nod,i;
    
    memset(t,0,sizeof(t));
    t[s]=-1;
    
    q[1]=s;
    for(li=ls=1;li<=ls;li++)
    {
      nod=q[li];
      for(i=1;i<=n;i++)
        if(!t[i] && c[nod][i]>f[nod][i])
        {
                 q[++ls]=i;
                 t[i]=nod;
                 if(i==d) return 1;
        }
    }
    return 0;
}

int main()
{
    int i,r,x,y,j,s,d;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {  
        fin>>x>>y;
        fin>>c[x][y];
    }
    s=1,d=n;
    while(bf(s,d))
      for(i=1;i<=n;i++)
      {
          if(t[i]==-1 || c[i][d]<=f[i][d])
             continue;
          
          r=c[i][d]-f[i][d];
          for(j=i;j && j!=s;j=t[j])
            r=min(r,c[t[j]][j]-f[t[j]][j]);
          
          if(r==0) continue;
          
          f[i][d]+=r; f[d][i]-=r;
          for(j=i;j && j!=s;j=t[j])
          {
            f[t[j]][j]+=r;
            f[j][t[j]]-=r;
          }
          flux+=r;
      }
    fout<<flux<<'\n';
    fout.close();
    return 0;
}