Cod sursa(job #3320294)

Utilizator ElizaTElla Rose ElizaT Data 4 noiembrie 2025 20:23:25
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1e3 + 5;
const int INF = 1e9;

struct Edge {
    int to,r;
    int cap;
};
vector<Edge> e[NMAX];
int level[NMAX],it[NMAX];
int n,s,d,m;

void addEdge(int u, int v, int cap) {
    Edge a = {v, (int) e[v].size(), cap};
    Edge b = {u, (int) e[u].size(), 0};
    e[u].push_back(a);
    e[v].push_back(b);
}
bool bfs() {
    fill(level, level + n  +1, -1);
    queue<int> q;
    level[s] = 0;
    q.push(s);
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (auto &a: e[u]) {
            if (level[a.to] == -1 && a.cap > 0) {
                level[a.to] = level[u] + 1;
                q.push(a.to);
            }
        }
    }
    return level[d] != -1;
}
int dfs(int u, int flow) {
    if (u == d)
        return flow;
    for (int &i = it[u];i < (int)e[u].size();i++) {
        Edge &a = e[u][i];
        if (a.cap > 0 && level[a.to] == level[u] + 1) {
            int b = dfs(a.to, min(flow, a.cap));
            if (b > 0) {
                a.cap -= b;
                e[a.to][a.r].cap += b;
                return b;
            }
        }
    }
    return 0;
}
int dinic() {
    int mx = 0,b;
    while (bfs()) {
        fill(it, it + n + 1, 0);
        b = dfs(s, INF);
        while (b) {
            mx += b;
            b = dfs(s, INF);
        }
    }
    return mx;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int u,v,c;
    fin >> n >> m;
    s = 1;
    d = n;
    for (int i = 0;i < m;i++) {
        fin >> u >> v >> c;
        addEdge(u, v, c);
    }
    fout << dinic() << '\n';
    return 0;
}