Cod sursa(job #275662)

Utilizator MarquiseMarquise Marquise Data 10 martie 2009 16:43:25
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 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];

struct NOD
{
    int info;
    NOD *next;
};

NOD *l[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];
    NOD *aux;

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

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

    while ( p <= u)
    {
        nod = q[p];
        for ( aux = l[nod]; aux; aux = aux -> next)
            if ( !t[aux -> info] && c[nod][aux -> info] - f[nod][aux -> info] > 0 )
            {
                u++;
                q[u] = aux -> info;
                t[aux -> info] = nod;
                if ( aux -> info == 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;
    NOD *aux;

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

    scanf("%d %d", &n, &m);

    for ( i = 1; i <= n; i++)
        l[i] -> next = NULL;
        
    for ( i = 1; i <= m; i++)
    {
        scanf("%d %d %d", &x, &y, &ca);
        c[x][y] = ca;
        aux = new NOD;
        aux -> info = y;
        aux -> next = l[x];
        l[x] = aux;
       // c[x][0]++;
    }
    s = 1;
    d = n;
    
    flux_maxim();

    return 0;
}