Cod sursa(job #275649)

Utilizator MarquiseMarquise Marquise Data 10 martie 2009 16:36:42
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#include <string.h>

#define NMAX 1001
#define INF 200000

int n, m, s, d, flux, c[NMAX][NMAX], f[NMAX][NMAX], t[NMAX];

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

int BFS(int s, int d)
{
    int p, u, nod, i, q[NMAX];

    memset(t, 0, sizeof(t));

    p = u = 0;
    q[p] = s;
    t[s] = -1;

    while ( p <= u)
    {
        nod = q[p];
        for ( i = 1; i <= n; i++)
            if ( !t[i] && c[nod][i] - f[nod][i] > 0 )
            {
                u++;
                q[u] = i;
                t[i] = nod;
                if ( i == d)
                    return 1;
            }
        p++;
    }

    return 0;
}

void flux_maxim()
{
    int i, cr;

    for ( flux = 0; BFS(s, d); flux +=cr)
    {
        cr = INF;
        i = d;
        while ( i != s)
        {
            cr = minim( cr, c[t[i]][i] - f[t[i]][i]);
            i = t[i];

        }
        i = d;
        while ( i != s)
        {
            f[t[i]][i] += cr;
            f[i][t[i]] -= cr;
            i = t[i];
        }
        
    }

    printf("%d\n", flux);
}

int main()
{
    int i, x, y, ca;

    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for ( i = 1; i <= m; i++)
    {
        scanf("%d %d %d", &x, &y, &ca);
        c[x][y] = ca;

    }
    s = 1;
    d = n;
    
    flux_maxim();

    return 0;
}