Cod sursa(job #1005575)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 5 octombrie 2013 12:01:42
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <vector>
#include <bitset>
#include <algorithm>
using namespace std;

const int NMAX = 1003, INFI = 2e9;

vector <int> G[NMAX];
bitset <NMAX> nviz;
int cap[NMAX][NMAX], res[NMAX][NMAX], path[NMAX], Q[NMAX], N, l;

bool BFS () {

    int node, i;
    vector <int> :: iterator j;
    nviz.set ();
    Q[l = 1] = 1;
    i = 1;
    while (i <= l) {
        node = Q[i];
        ++i;
        nviz[node] = 0;
        if (node == N)
            continue;
        for (j = G[node].begin (); j != G[node].end (); ++j)
            if (nviz[*j] && cap[node][*j] != res[node][*j])
                path[*j] = node,
                Q[++l] = *j;
    }
    return !nviz[N];

}

int main () {

    freopen ("maxflow.in", "r", stdin);
    freopen ("maxflow.out", "w", stdout);
    int M, a, b, i, node, _min, max_flow = 0;
    vector <int> :: iterator j;
    scanf ("%d%d", &N, &M);
    for (i = 1; i <= M; ++i)
        scanf ("%d%d", &a, &b),
        scanf ("%d", &cap[a][b]),
        G[a].push_back (b),
        G[b].push_back (a);
    while (BFS ())
        for (j = G[N].begin (); j != G[N].end (); ++j) {
            if (nviz[*j] || cap[*j][N] == res[*j][N])
                continue;
            _min = INFI;
            path[N] = *j;
            for (node = N; node != 1; node = path[node])
                _min = min (_min, cap[path[node]][node] - res[path[node]][node]);
            for (node = N; node != 1; node = path[node])
                res[path[node]][node] += _min,
                res[node][path[node]] -= _min;
            max_flow += _min;
        }
    printf ("%d", max_flow);

}