Cod sursa(job #2818301)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 15 decembrie 2021 20:20:03
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
class Flow {
    vector <vector <int>> g;
    int n, S, D;
    vector <vector <int>> c;
    vector <int> d, p;
    int bfs() {
        for(int i = 0; i < n; i++) d[i] = p[i] = 0;
        d[S] = 1;
        queue <int> q; q.push(S);
        while(!q.empty()) {
            int top = q.front(); q.pop();
            for(int adj : g[top])
                if(c[top][adj] && !d[adj]) {
                    d[adj] = d[top] + 1,
                    p[adj] = top,
                    q.push(adj);
                    if(adj == D) return top + 1;
                }
        }
        return 0;
    }
public:
    void read(istream& in) {
        int m, u, v, w;
        in >> n >> m; S = 0; D = n - 1;
        g.resize(n); c.resize(n);
        for(auto& x : c) x.resize(n, 0);
        for(int i = 0; i < m; i++) {
            in >> u >> v >> w; u--, v--;
            g[u].push_back(v),
            g[v].push_back(u),
            c[u][v] = w,
            c[v][u] = 0;
        }
    }
    int edmonds_karp() {
        int last, res = 0; d.resize(n); p.resize(n);
        while(last = bfs()) {
            int f = c[last - 1][D];
            for(int node = last - 1; node; node = p[node])
                f = min(f, c[p[node]][node]);
            for(int node = D; node; node = p[node])
                c[p[node]][node] -= f,
                c[node][p[node]] += f;
            res += f;
        }
        return res;
    }
};
Flow f;

int main()
{
    f.read(fin);
    fout << f.edmonds_karp();
    return 0;
}