Cod sursa(job #2973986)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 2 februarie 2023 21:20:19
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;
const int N = 1000 + 5;
using ll = long long;
struct edge {
    int from, to, cap;
};
vector <edge> e;
vector <int> g[N];
int n, m, s, t;
int lvl[N], rem[N];
void add_edge(int u, int v, int w) {
    g[u].push_back(e.size());
    e.push_back({u, v, w});
    g[v].push_back(e.size());
    e.push_back({v, u, 0});
}
bool bfs() {
    fill(lvl + 1, lvl + n + 1, 0);
    queue <int> q;
    q.push(s); lvl[s] = 1;
    while(!q.empty()) {
        int u = q.front();
        q.pop();
        for(int id : g[u]) {
            int v = e[id].to;
            if(e[id].cap && !lvl[v]) {
                lvl[v] = lvl[u] + 1;
                q.push(v);
            }
        }
    }
    return lvl[t];
}
int dfs(int u, int flow) {
    if(!flow || u == t) return flow;
    for(int& cid = rem[u]; cid < g[u].size(); cid++) {
        int id = g[u][cid];
        int v = e[id].to;
        if(lvl[v] != lvl[u] + 1 || e[id].cap == 0) continue;
        int f = dfs(v, min(flow, e[id].cap));
        if(!f) continue;
        e[id].cap -= f;
        e[id ^ 1].cap += f;
        return f;
    }
    return 0;
}

int main() {
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");
    cin >> n >> m;
    s = 1; t = n;
    for(int i = 1, u, v, w; i <= m; i++) {
        cin >> u >> v >> w;
        add_edge(u, v, w);
    }
    ll flow = 0;
    while(bfs()) {
        fill(rem, rem + n + 1, 0);
        while(ll f = dfs(s, 1e9))
            flow += f;
    }
    cout << flow;
    return 0;
}