Cod sursa(job #1397967)

Utilizator retrogradLucian Bicsi retrograd Data 23 martie 2015 21:13:43
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
#include<queue>
#include<vector>
#include<unordered_map>
#include<cstring>

using namespace std;
typedef int var;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

var mC = (1 << 17);
#define MAXN 1005

bool VIZ[MAXN];
var PARENT[MAXN];
queue<var> Q;
unordered_map<var, var> F[MAXN], C[MAXN];
vector<var> G[MAXN];

var S, D;

bool bfs(var m) {
    memset(VIZ, 0, sizeof(VIZ));
    PARENT[D] = 0;
    VIZ[S] = 1;
    Q.push(S);
    while(!Q.empty()) {
        var node = Q.front();
        Q.pop();
        for(auto vec : G[node]) {
            if(C[node][vec] - F[node][vec] >= m && !VIZ[vec]) {
                VIZ[vec] = 1;
                PARENT[vec] = node;
                Q.push(vec);
            }
        }
    }
    return PARENT[D] != 0;
}

var maxflow() {
    var i;
    var total = 0;
    for(i=mC;i;i>>=1) {
        while(bfs(i)) {
            for(var node = D; node != S; node = PARENT[node]) {
                F[PARENT[node]][node] += i;
                F[node][PARENT[node]] -= i;
            }
            total += i;
        }
    }
    return total;
}

int main() {
    var n, m, a, b, c;
    fin>>n>>m;

    S = 1;
    D = n;

    while(m--) {
        fin>>a>>b>>c;
        G[a].push_back(b);
        G[b].push_back(a);
        C[a][b] = c;
    }

    fout<<maxflow();
    return 0;
}