Cod sursa(job #465146)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 23 iunie 2010 13:51:02
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <string.h>

#include <vector>
#include <queue>

using namespace std;

int n, m;

vector <int> v[1002];

int c[1002][1002], f[1002][1002];
int up[1002];

bool bfs ()
{
    memset (up, -1, sizeof (up));
    up[1] = 0;

    int i, nod;
    queue <int> q;

    q.push (1);
    while (!q.empty ())
    {
        nod = q.front ();

        for (i = 0; i < v[nod].size (); i ++)
            if (up[v[nod][i]] == -1 &&  c[nod][v[nod][i]] > f[nod][v[nod][i]])
            {
                up[v[nod][i]] = nod;

                if (v[nod][i] == n)
                    return 1;

                q.push (v[nod][i]);
            }

        q.pop ();
    }

    return 0;
}

int flux ()
{
    int min, nod, sol = 0;;

    while (bfs ())
    {
        nod = n;
        min = c[up[n]][n] - f[up[n]][n];
        while (up[nod])
        {
            if (c[up[nod]][nod] - f[up[nod]][nod] < min)
                min = c[up[nod]][nod] - f[up[nod]][nod];
            nod = up[nod];
        }

        nod = n;
        while (up[nod])
        {
            f[up[nod]][nod] += min;
            f[nod][up[nod]] -= min;
            nod = up[nod];
        }

        sol += min;
    }

    return sol;
}

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

    scanf ("%d %d", &n, &m);
    int i, x, y, cap;
    for (i = 1; i <= m; i ++)
    {
        scanf ("%d %d %d", &x, &y, &cap);

        c[x][y] += cap;
        v[x].push_back (y);
        v[y].push_back (x);
    }

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

    return 0;
}