Cod sursa(job #2886715)

Utilizator andu2006Alexandru Gheorghies andu2006 Data 8 aprilie 2022 10:56:05
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include<bits/stdc++.h>

using namespace std;
const int NMAX=1e3+5;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int cap[NMAX][NMAX],flow[NMAX][NMAX];
bool adj[NMAX][NMAX];
vector<int> edg[NMAX];
int layer[NMAX],ptr[NMAX],s,t;
int dfs(int u, int f){
    if(u==t || f==0) return f;
    for(int &i=ptr[u];i<edg[u].size();i++){
        int v=edg[u][i];
        if(layer[v]==layer[u]+1 && flow[u][v]<cap[u][v]){
            int new_flow=dfs(v,min(f,cap[u][v]-flow[u][v]));
            if(new_flow){
                flow[u][v]+=new_flow;
                flow[v][u]-=new_flow;

                return new_flow;
            }
        }
    }
    return 0;
}
int main(){
    int n,m,ans=0;
    fin>>n>>m;
    for(int i=0;i<m;i++){
        int x,y,c;
        fin>>x>>y>>c;
        cap[x][y]+=c;
        adj[x][y]=adj[y][x]=1;
    }
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(adj[i][j]) edg[i].push_back(j);
    s=1,t=n;
    for(;;){
        for(int i=1;i<=n;i++)
            layer[i]=-1,ptr[i]=0;
        layer[s]=0;
        queue<int> 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;
        int new_flow=1;
        while((new_flow=dfs(s,INT_MAX))){
            iter++;
            ans+=new_flow;
        }
        if(iter==0) break;
    }
    fout<<ans;
    return 0;
}