Cod sursa(job #3037934)

Utilizator DordeDorde Matei Dorde Data 26 martie 2023 17:59:35
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include<algorithm>
#include<fstream>
#include<vector>
#include<queue>

#define inf 1e9

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int const N = 1001;

int n , m , a , b , c;
int lv[N];
int f[N][N];
bool bfs(){
    queue<int> q;
    fill(lv , lv + 1 + n , inf);
    lv[1] = 0;
    q.push(1);
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(int i = 1 ; i <= n ; ++ i){
            if(lv[i] == inf && f[x][i] > 0){
                lv[i] = 1 + lv[x];
                q.push(i);
            }
        }
    }
    return lv[n] != inf;
}
int dfs(int x , int fl){
    if(x == n)return fl;
    for(int i = 1 ; i <= n ; ++ i){
        if(f[x][i] > 0 && lv[i] == 1 + lv[x]){
            int z = dfs(i , min(fl , f[x][i]));
            if(z){
                f[x][i] -= z;
                f[i][x] += z;
                return z;
            }
            lv[i] = inf;
        }
    }
    return 0;
}
int maxflow(){
    int flow = 0;
    while(bfs()){
        int fx(0);
        do{
            fx = dfs(1 , inf);
            flow += fx;
        }while(fx != 0);
    }
    return flow;
}
int main(){
    fin >> n >> m;
    for(int i = 1 ; i <= m ; ++ i){
        fin >> a >> b >> c;
        f[a][b] += c;
    }
    fout << maxflow() << '\n';
    return 0;
}