Cod sursa(job #1051068)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 9 decembrie 2013 18:04:59
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;

const int NMAX = 1003, INFI = 2e9;

vector <int> G[NMAX];
bitset <NMAX> viz;
queue <int> Q;
int N, cap[NMAX][NMAX], rez[NMAX][NMAX], path[NMAX];

inline bool BFS () {

    vector <int> :: iterator i;
    int node;
    viz.set ();
    for (Q.push (1); !Q.empty (); Q.pop ()) {
        node = Q.front ();
        if (node == N)
            continue;
        for (i = G[node].begin (); i != G[node].end (); ++i)
            if (viz[*i] && cap[node][*i] != rez[node][*i]) {
                Q.push (*i);
                path[*i] = node;
                viz[*i] = 0;
            }
    }
    return !viz[N];

}

int main () {

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

}