Cod sursa(job #768329)

Utilizator igsifvevc avb igsi Data 16 iulie 2012 17:07:48
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>

#define xx 1001

using namespace std;

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

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

int bf(int s,int d)
{
    int li,ls,nod,i,q[xx];
    
    memset(t,0,sizeof(t));
    
    q[1]=s;
    t[s]=-1;
    
    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;
}


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

int main()
{
    int i,x,y;
    
    fin>>n>>m;
    
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fin>>c[x][y];
    }
    
    S=1;D=n;
    
    int j,r;
    
    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!=S && j;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!=S && j;j=t[j])
           {
               f[t[j]][j]+=r;
               f[j][t[j]]-=r;
           }
           flux+=r;
       }
    
    fout<<flux<<'\n';
    
    fout.close();
    return 0;
}