Cod sursa(job #3348936)

Utilizator moloDaniMolodet Andrei Daniel moloDani Data 24 martie 2026 18:43:02
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <queue>

using namespace std;

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

const int mxN = 1e3 + 1, C_MAX = 11e4 + 1;

int cap[mxN][mxN], n, m, rang[mxN], iter[mxN];
bool visited[mxN];
vector<int> G[mxN];

void updateMuchie(int a, int b, int v){
    cap[a][b] -= v;
    cap[b][a] -= v;
}

bool bfs(int s){
    queue<int> Q;
    for(int i = 1; i <= n; i++)
        rang[i] = 0;
    rang[s] = 1;
    Q.push(s);
    
    while(!Q.empty()){
        int nod = Q.front();
        Q.pop();

        for(int x : G[nod]){
            if(cap[nod][x] > 0 && !rang[x]){
                rang[x] = rang[nod] + 1;
                Q.push(x);
            }
        }
    }

    return rang[n];
}

int dfs(int nod, int cantitate){
    if(nod == n) 
        return cantitate;

    for(int &i = iter[nod]; i < (int)G[nod].size(); i++){
        int x = G[nod][i];
        if(cap[nod][x] > 0 && rang[x] == rang[nod] + 1){
            int drum = dfs(x, min(cap[nod][x], cantitate));
            if(drum){
                updateMuchie(nod, x, drum);
                return drum;
            }
        }
    }

    return 0;
}

int main(){
    int ans = 0, f;
    fin >> n >> m;
    for(int i = 1; i <= m; i++){
        int a, b, c;
        fin >> a >> b >> c;
        cap[a][b] = c;
        G[a].push_back(b);
        G[b].push_back(a);
    }

    while(bfs(1)){
        for(int i = 1; i <= n; i++)
            iter[i] = 0;
        do{
            f = dfs(1, C_MAX);
            ans += f;
        }while(f);
    }

    fout << ans;
}