Cod sursa(job #262452)

Utilizator crawlerPuni Andrei Paul crawler Data 19 februarie 2009 12:41:50
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#include <string.h>

#define Nmax 1024

int f[Nmax][Nmax], c[Nmax][Nmax];
int t[Nmax], v[Nmax], n,m,s,d;
int q[Nmax];

int BF()
{
     int st=0,dr=1,nod;
     q[1] = 1;
     memset(v,0,sizeof(v));     
     memset(t,0,sizeof(t));     
     v[1] = 1;
     while (st < dr)
     {
          nod = q[++st];
          for (int i=1;i<=n;++i) if (c[nod][i]>f[nod][i] && v[i] == 0)
          {
               v[i] = 1;
               t[i] = nod;
               q[++dr] = i;     
          } 
     }
     return v[n];
}

int main()
{
     freopen("maxflow.in","r",stdin);     
     freopen("maxflow.out","w",stdout);
     
     scanf("%d%d", &n,&m);

     int x,y,C,r,flux=0;     
     while (m--) 
     {
          scanf("%d%d%d", &x,&y,&C);
          c[x][y] = C;         
     }
     
     while (BF())
     {
          for (int j=1;j<=n;++j) if (c[j][n] > f[j][n])
          {
               r = c[j][n]-f[j][n];
               for (int i=j;i!=1;i=t[i])
                    if (c[t[i]][i] - f[t[i]][i] < r)
                         r = c[t[i]][i] - f[t[i]][i];
               if (r > 0)
               {
                    for (int i=j;i!=1;i=t[i])
                         f[t[i]][i] += r,
                         f[i][t[i]] -= r;                    
                    flux += r;     
                    f[j][n] += r;
                    f[n][j] -= r;
               }
          }     
     }
     
     printf("%d\n", flux);
     
     return 0;
}