Cod sursa(job #3338016)

Utilizator darian4444Verniceanu Darian darian4444 Data 31 ianuarie 2026 10:45:31
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;

int fr[1005],level[1005],cap[1005][1005],N,M;
int i,j,a,b,c,x,ans,gain;
vector<int> A[1005];
deque<int> dq;

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

void bfs(int start){
    for (int i = 1;i <= N;i++){
        fr[i] = 0;
        level[i] = 0;
    }
    
    level[start] = 1;
    dq.push_back(start);
    while (!dq.empty()){
        a = dq.front();
        dq.pop_front();
        
        for (auto b : A[a])
            if (cap[a][b] != 0 && level[b] == 0){
                level[b] = level[a]+1;
                dq.push_back(b);
            }
    }
    
}

int dfs(int k,int mini){
    if (k == N || mini == 0)
        return mini;
    while (fr[k] < A[k].size()){
        int next_k = A[k][fr[k]];
        if (cap[k][next_k] != 0 && level[next_k] == level[k] + 1){
            x = dfs(next_k,min(mini,cap[k][next_k]));
            if (x > 0){
                cap[k][next_k] -= x;
                cap[next_k][k] += x;
                return x;
            }
            else
                fr[k]++;
        }
        else 
            fr[k]++;
    }
    return 0;
}

bool flux(int start){
    bfs(start);
    if (level[N] == 0)
        return 0;
        
    gain = 0;
    while (true){
        x = dfs(1,1e9);
        if (x == 0)
            break;
        gain += x;
    }
    ans += gain;
    
    return gain;
}

int main()
{
    fin >> N >> M;
    
    for (i = 1;i <= M;i++){
        fin >> a >> b >> c;
        A[a].push_back(b);
        A[b].push_back(a);
        cap[a][b] = c;
    }
    
    while (flux(1));
    fout << ans;

    return 0;
}