Cod sursa(job #3219807)

Utilizator dariusbandilaBandila Darius-Mihai dariusbandila Data 1 aprilie 2024 12:31:35
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#define pb push_back
#define int long long
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX=300;
const int INF=2e9+10;
int v[NMAX][NMAX],n,a,b,c,maxx,m;
int d[NMAX];
int last[NMAX];
bool bfs(){
    for(int i=1;i<=n;i++){
        last[i]=1;
        d[i]=0;
    }
    queue<int>q;
    q.push(1);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        if(u==n)continue;
        for(int i=2;i<=n;i++){
            if(d[i]==0&&v[u][i]>0){
                d[i]=d[u]+1;
                q.push(i);
            }
        }
    }
    return d[n];
}
int dfs(int nr,int flow){
    if(nr==n)return flow;
    while(last[nr] <= n){
        int u=last[nr];
        if(v[nr][u]>0&&d[u]==d[nr]+1){
            int sol=dfs(u, min(flow, v[nr][u]));
            if(sol!=0){
                v[nr][u]-=sol;
                v[u][nr] += sol;
                return sol;
            }
        }
        last[nr]++;
    }
    return 0;
}
int32_t main(){
    fin>>n>>m;
    for(int i=1;i<=m;i++){
     	int a,b,c;
        cin>>a>>b>>c;
        v[a][b]=c;
    }
    while(bfs()){
        while(1){
            int x=dfs(1,INF);
            if(x!=0)maxx+=x;
            else break;
        }
    }
     fout << maxx;
    return 0;
}