Cod sursa(job #465150)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 23 iunie 2010 13:58:26
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 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, i;

    while (bfs ())
    {
        for (i = 1; i < n; i ++)
            if (up[i] != -1 && c[i][n] > f[i][n])
            {
                nod = i;
                min = c[i][n] - f[i][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];
                }

                if (!min)
                    continue;

                f[i][n] += min;
                f[n][i] -= min;

                nod = i;
                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;
}