Cod sursa(job #1325796)

Utilizator retrogradLucian Bicsi retrograd Data 24 ianuarie 2015 12:57:02
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
#include<vector>
#include<queue>

#define INF 1000001
#define MAXN 2001

using namespace std;
typedef int var;

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

var F[MAXN][MAXN], C[MAXN][MAXN];
vector<var> G[MAXN];

bool VIZ[MAXN];
var PARENT[MAXN];
var st, ed, n;
queue<var> Q;
bool bfs() {

    for(var i=1; i<=n; i++) {
        VIZ[i] = 0;
        PARENT[i] = 0;
    }

    Q.push(st);
    VIZ[st] = 1;
    while(!Q.empty()) {
        var node = Q.front();
        Q.pop();
        for(vector<var>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
            var vec = *it;
            if(F[node][vec] < C[node][vec] && !VIZ[vec]) {
                VIZ[vec] = 1;
                PARENT[vec] = node;
                Q.push(vec);
            }
        }
    }
    return VIZ[ed];
}

var maxflow() {
    var flow = 0;
    while(bfs()) {
        for(vector<int>::iterator it = G[ed].begin(); it != G[ed].end(); ++it) {

            var node = *it;
            var MIN = C[node][ed] - F[node][ed];

            while(PARENT[node]) {
                MIN = min(MIN, C[PARENT[node]][node] - F[PARENT[node]][node]);
                node = PARENT[node];
            }

            node = *it;
            F[node][ed] += MIN;
            F[ed][node] -= MIN;

            while(PARENT[node]) {
                F[PARENT[node]][node] += MIN;
                F[node][PARENT[node]] -= MIN;
                node = PARENT[node];
            }
            flow += MIN;
        }
    }
    return flow;
}

int main() {
    var m, a, b, c;
    fin>>n>>m;
    st = 1;
    ed = 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;
}