Cod sursa(job #1654778)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 17 martie 2016 14:40:33
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 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()) {
            int x = q.front();
            q.pop();
            if(x == n - 1) continue;
            for(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(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;
}