Cod sursa(job #2884863)

Utilizator andu2006Alexandru Gheorghies andu2006 Data 5 aprilie 2022 08:50:21
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;
typedef int ll;
const ll NMAX=1e3+5,MMAX=5e3+5;
ll cap[NMAX][NMAX],flow[NMAX][NMAX];
vector<ll> edg[NMAX];
ll layer[NMAX],ptr[NMAX];
ll s,t,n,m;
ll dfs(ll u, ll f){
    if(!flow || u==t) return f;
    for(ll& i=ptr[u];i<edg[u].size();i++){
        ll v=edg[u][i];
        if(layer[v]==layer[u]+1 && flow[u][v]<cap[u][v]){
            ll new_flow=dfs(v,min(f,cap[u][v]-flow[u][v]));

            flow[u][v]+=new_flow;
            flow[v][u]-=new_flow;

            return new_flow;
        }
    }
    return 0;
}
int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin>>n>>m;
    for(ll i=0;i<m;i++){
        ll u,v,f;
        fin>>u>>v>>f;
        edg[u].push_back(v),edg[v].push_back(u);
        cap[u][v]+=f;
        //cap[v][u]-=f;
    }
    s=1,t=n;
    ll ans=0;
    for(;;){
        for(ll i=1;i<=n;i++)
            layer[i]=-1,ptr[i]=0;
        layer[s]=0;
        queue<ll> q;
        q.push(s);
        while(!q.empty()){
            for(auto it : edg[q.front()]){
                if(flow[q.front()][it]<cap[q.front()][it] && layer[it]==-1)
                    layer[it]=layer[q.front()]+1,q.push(it);
            }
            q.pop();
        }
        if(layer[t]==-1) break;
        int iter=0;
        for(;;){
            ll new_flow=dfs(s,INT_MAX);
            if(new_flow==0) break;
            iter++;
            ans+=new_flow;
        }
        if(iter==0) break;
    }
    fout<<ans<<'\n';
    return 0;
}