Cod sursa(job #1654783)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 17 martie 2016 14:47:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <algorithm>
#include <vector>
#include <fstream>
#include <queue>

using namespace std;

#define pb push_back

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

int main() {
    int n, m;

    in >> n >> m;

    vector < vector < int > > adj(n), flow(n, vector < int >(n, 0)), cap(n, vector < int >(n, 0));
    for(int i = 1, a, b, c; i <= m; i++) {
        in >> a >> b >> c;
        a--; b--;
        cap[a][b] = c;
        adj[a].pb(b);
        adj[b].pb(a);
    }

    vector < bool > vis(n, false);
    vector < int > f(n, -1);
    queue < int > q;
    int rez = 0;

    while(true) {
        vis[0] = true;
        f[0] = 0;
        q.push(0);
        while(!q.empty()) {
            const int x = q.front();
            q.pop();
            if(x == n - 1) continue;
            for(const auto i : adj[x]) {
                if(!vis[i] && flow[x][i] < cap[x][i]) {
                    vis[i] = 1;
                    f[i] = x;
                    q.push(i);
                }
            }
        }
        if(!vis[n - 1]) break;
        for(const auto start : adj[n - 1]) {
            if(!vis[start]) continue;
            int minflow = 0x7fffffff;
            f[n - 1] = start;
            for(int i = n - 1; i != 0; i = f[i]) {
                minflow = min(minflow, cap[f[i]][i] - flow[f[i]][i]);
            }
            if(minflow <= 0) continue;
            for(int i = n - 1; i != 0; i = f[i]) {
                flow[f[i]][i] += minflow;
                flow[i][f[i]] -= minflow;
            }
            rez += minflow;
        }
        fill(begin(f), end(f), -1);
        fill(begin(vis), end(vis), false);
    }

    out << rez << '\n';
    return 0;
}