Cod sursa(job #2875481)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 21 martie 2022 18:34:03
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
using namespace std;

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

int const N(1005), inf(2e9);
int cap[N][N], n, m, dad[N];
bitset<N> viz;
vector<int> g[N];
queue<int> q;

inline void AddEdge(int const& x, int const& y, int const& w) {
    g[x].emplace_back(y);
    g[y].emplace_back(x);
    cap[x][y] = w;
}

inline bool BF(int const& S = 1, int const& D = n) {
    viz.reset();
    dad[S] = 0;
    viz[S] = 1;
    q.emplace(S);
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        for (int const& y : g[x])
            if (!viz[y] && cap[x][y]) {
                dad[y] = x;
                viz[y] = 1;
                q.emplace(y);
            }
    }
    return viz[D];
}

inline int MaxFlow(int const& S = 1, int const& D = n) {
    int maxf = 0;
    while (BF()) {
        int flow = inf;
        for (int x = D; x != S; x = dad[x])
            flow = min(flow, cap[dad[x]][x]);
        for (int x = D; x != S; x = dad[x]) {
            cap[dad[x]][x] -= flow;
            cap[x][dad[x]] += flow;
        }
        maxf += flow;
    }
    return maxf;
}

int main() {
    fin >> n >> m;
    while (m--) {
        int x, y, w;
        fin >> x >> y >> w;
        AddEdge(x, y, w);
    }
    fout << MaxFlow();
    return 0;
}