Cod sursa(job #300253)

Utilizator vladbBogolin Vlad vladb Data 7 aprilie 2009 12:23:43
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>

const int inf=1000000;
int n,m,flux,c[1001][1001],t[1001],s[1001];
           
void citire()
{   int i,x,y,z;
    freopen("maxflow.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {   scanf("%d%d%d",&x,&y,&z);
        c[x][y]=z;
    }
    fclose(stdin);
}

int BF()
{   int p=1,u=1,i;
    s[p]=1;
    while(p<=u)
    {   for(i=1;i<=n;i++)
           if(!t[i]&&c[s[p]][i]&&i!=1)
           {   u++;
               s[u]=i;
               t[i]=s[p];
           }
       p++;
    }
    if(t[n]) return 1;
      else return 0; 
}
    
int main()
{   freopen("maxflow.out","w",stdout);
    int i,fmin,x;
    citire();  
    while(BF())
    {   for(i=1;i<=n;i++)
        {   if(t[i]<=0||c[i][n]<=0) continue;
            fmin=c[i][n];
            x=i; 
            while(t[x])
            {  if(c[t[x]][x]<fmin) fmin=c[t[x]][x];
               x=t[x];
            }
            x=i;
            flux+=fmin;
            c[i][n]-=fmin;
            c[n][i]+=fmin;
            while(t[x])
            {  c[t[x]][x]-=fmin;
               c[x][t[x]]+=fmin;
               x=t[x];
            }
        }
        for(i=1;i<=n;i++)
            t[i]=0;
    }
    printf("%d",flux);
    fclose(stdout);
    return 0;
}