Cod sursa(job #3348872)

Utilizator moloDaniMolodet Andrei Daniel moloDani Data 24 martie 2026 15:24:21
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <set>

using namespace std;

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

const int mxN = 1e3 + 1;

int cap[mxN][mxN], n, m;
bool visited[mxN];
set<int> G[mxN];

void modEdge(int a, int b, int c){
    cap[a][b] += c;
    if(!cap[a][b])
        G[a].erase(b);
    else
        G[a].insert(b);
}

int maxFlow(int start){
    int prev[mxN] = {0};
    queue<int> Q;
    Q.push(start);

    for(int i = 1; i <= n; i++)
        visited[i] = false;
    visited[start] = true;

    while(!Q.empty() && !visited[n]){
        int u = Q.front(); Q.pop();
        for(int v : G[u]){
            if(!visited[v] && cap[u][v] > 0){
                visited[v] = true;
                prev[v] = u;
                Q.push(v);
            }
        }
    }

    if(!visited[n]) return 0;

    // Find bottleneck
    int flow = 111000;
    for(int v = n; v != start; v = prev[v]){
        int u = prev[v];
        flow = min(flow, cap[u][v]);
    }

    // Update residual capacities
    for(int v = n; v != start; v = prev[v]){
        int u = prev[v];
        modEdge(u, v, -flow);
        modEdge(v, u, +flow);
    }

    return flow;
}

int main(){
    int ans = 0, f;
    fin >> n >> m;
    for(int i = 1; i <= m; i++){
        int a, b, c;
        fin >> a >> b >> c;
        modEdge(a, b, c);
    }

    do{
        f = maxFlow(1);
        ans += f;
    }while(f != 0);

    fout << ans;
}