Cod sursa(job #2818333)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 15 decembrie 2021 21:02:38
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 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> p;
    bool bfs() {
        for(int i = 1; i <= n; i++) p[i] = 0;
        queue <int> q; q.push(S);
        p[S] = 1;
        while(!q.empty()) {
            int top = q.front(); q.pop();
            //cout << top;
            for(int adj : g[top])
                if(c[top][adj] && !p[adj])
                    p[adj] = top,
                    q.push(adj);
        }
        return p[D] > 0;
    }
public:
    void read(istream& in) {
        int m, u, v, w;
        in >> n >> m; S = 1; D = n;
        g.resize(n + 1); c.resize(n + 1);
        for(auto& x : c) x.resize(n + 1, 0);
        for(int i = 0; i < m; i++) {
            in >> u >> v >> w;
            g[u].push_back(v),
            g[v].push_back(u),
            c[u][v] = w,
            c[v][u] = 0;
        }
    }
    int edmonds_karp() {
        p.resize(n);
        while(bfs()) for(int last : g[D]) {
            //cout << "\n";
            //for(int i = 1; i <= n; i++) cout << c[p[i]][i]; cout << "\n";
           // for(int i = 1; i <= n; i++) cout << c[i][p[i]]; cout << "\n";
            //cout << last << " ";
            int f = c[last][D];
            for(int node = last; node != S; node = p[node])
                f = min(f, c[p[node]][node]);
            c[last][D] -= f;
            c[D][last] += f;
            for(int node = last; node != S; node = p[node]) {
                c[p[node]][node] -= f;
                c[node][p[node]] += f;
            }
        }
        int res = 0;
        for(int adj : g[S])
            res += c[adj][S];
        return res;
    }
};
Flow f;

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