Cod sursa(job #3222462)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 10 aprilie 2024 11:57:00
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1000;

struct edge {
    int to, cap, flow, rid;
};

int n, m;
vector<edge> g[NMAX + 1];
int dist[NMAX + 1];
int ptr[NMAX + 1];

void add_edge(int u, int v, int c) {
    int r1 = g[v].size();
    int r2 = g[u].size();
    g[u].push_back({v, c, 0, r1});
    g[v].push_back({u, 0, 0, r2});
}

bool bfs(int s, int t) {
    queue<int> q;
    q.push(s);
    for (int i = 1; i <= n; i++)
        dist[i] = -1;
    dist[s] = 0;
    while (!q.empty()) {
        int node = q.front();
        q.pop();
        for (auto it: g[node]) {
            if (dist[it.to] != -1) continue;
            if (it.flow == it.cap) continue;
            dist[it.to] = dist[node] + 1;
            q.push(it.to);
        }
    }
    return dist[t] > -1;
}

int dfs(int node, int t, int flow) {
    if (node == t)
        return flow;

    for (; ptr[node] < g[node].size(); ptr[node]++) {
        auto &it = g[node][ptr[node]];

        if (it.flow == it.cap) continue;
        if (dist[it.to] != dist[node] + 1) continue;

        int curFlow = min(flow, it.cap - it.flow);
        curFlow = dfs(it.to, t, curFlow);

        if (curFlow > 0) {
            it.flow += curFlow;
            g[it.to][it.rid].flow -= curFlow;
            return curFlow;
        }

    }

    return 0;
}

int flow(int s, int t) {
    int ans = 0;
    while (bfs(s, t)) {
        for (int i = 1; i <= n; i++)
            ptr[i] = 0;
        int f = dfs(s, t, 1e9);
        while (f > 0) {
            ans += f;
            f = dfs(s, t, 1e9);
        }
    }
    return ans;
}

void Read() {
    fin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v, c;
        fin >> u >> v >> c;
        add_edge(u, v, c);
    }
}

void Solve() {
    fout << flow(1, n) << '\n';
}

int main() {
    Read();
    Solve();
    return 0;
}