Cod sursa(job #1824494)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 7 decembrie 2016 21:53:04
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>

#define f first
#define s second
#define pii pair <int, int>

using namespace std;

int n, m;
vector <int> v[1024], lst;
int f[1024][1024], c[1024][1024], t[1024];
queue <int> q;

inline void del ()
{
    vector <int> change;
    change.swap (lst);
}

inline bool bfs ()
{
    q.push (1);
    t[1] = -1;

    bool OK = false;
    for (; !q.empty (); q.pop ())
    {
        int nod = q.front ();

        for (auto &it : v[nod])
        {
            if (it == n)
            {
                if (c[nod][it] > f[nod][it])
                    OK = true,
                    lst.push_back (nod);

                continue;
            }

            if (!t[it] && c[nod][it] > f[nod][it])
                t[it] = nod,
                q.push (it);
        }
    }

    return OK;
}

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

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

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

        if (!c[x][y]) v[x].push_back (y);
        c[x][y] += cost;

        if (!c[y][x]) v[y].push_back (x);
    }

    int flux = 0;
    for (; bfs ();)
    {
        for (auto &it : v[n])
        {
            int nod = it, mi = 2000000000;
            for (; t[nod] > 0; nod = t[nod])
                mi = min (mi, c[t[nod]][nod] - f[t[nod]][nod]);

            flux += mi;
            nod = it;
            for (; t[nod] != -1; nod = t[nod])
                f[t[nod]][nod] += mi,
                f[nod][t[nod]] -= mi;
        }

        for (int i = 1; i <= n; ++i)
            t[i] = 0;

        del ();
    }

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

    return 0;
}