Cod sursa(job #633582)

Utilizator marinaMarina Horlescu marina Data 14 noiembrie 2011 02:16:24
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
//Flux Maxim

#include <cstdio>
#include <vector>
#include <cstring>

#define NMAX 1024

using namespace std;

int n, m;
int f[NMAX][NMAX], c[NMAX][NMAX], t[NMAX], q[NMAX], viz[NMAX];
vector<int> graf[NMAX];

int minim(int a, int b)
{
    return a < b ? a:b;
}
int BFS()
{
     int p, u = 1, x, y, i;
     memset(viz, 0, sizeof(viz));
     q[1] = 1;
     viz[1] = 1;
     for(p = 1;p <= u; ++p)
     {
         x = q[p];
         if(x == n) continue;
         for(i = 0; i < graf[x].size(); ++i)
         {
             y = graf[x][i];
             if(c[x][y] == f[x][y] || viz[y]) continue;
             viz[y] = 1;
             q[++u] = y;
             t[y] = x;
         }
     }
     return viz[n];
}
int main()
{
    int i, j, flux, fmin, x, y, cp;
    
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    
    scanf("%d %d", &n, &m);
    for(i = 0; i < m; ++i)
    {
        scanf("%d %d %d", &x, &y, &cp);
        graf[x].push_back(y);
        graf[y].push_back(x);
        c[x][y] += cp;
    }
    
    for(flux = 0; BFS();)
        for(i = 0; i < graf[n].size(); ++i)
        {
            x = graf[n][i];
            if(f[x][n] == c[x][n] || !viz[x]) continue;
            t[n] = x;
            
            fmin = 0x3f3f3f3f;
            for(i = n; i != 1; i = t[i])
                  fmin = minim(fmin, c[t[i]][i] - f[t[i]][i]);
            if(!fmin) continue;
             
            for(i = n; i != 1; i = t[i])    
            {
                f[t[i]][i] += fmin,
                f[i][t[i]] -= fmin;
            }
            
            flux += fmin;
        }   
    
    printf("%d\n", flux);
    return 0;
}