Cod sursa(job #2918746)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 12 august 2022 19:53:35
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>//Dinic's algorithm
using namespace std;

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

const int dim=1009,inf=1e9;

vector<int>adj[dim];

int n,m;
int level[dim],ptr[dim];
int flow[dim][dim],capacity[dim][dim];

void bfs(){
    queue<int>q;
    q.push(1);
    while(!q.empty()){
        int x=q.front();
        q.pop();
        for(int y:adj[x]){
            if(level[y]==-1&&capacity[x][y]-flow[x][y]>0){
                level[y]=level[x]+1;
                q.push(y);
            }
        }
    }
}

int dfs(int x,int pushed){
    if(pushed==0){
        return 0;
    }
    if(x==n){
        return pushed;
    }
    for(int& i=ptr[x];i<adj[x].size();i++){
        int y=adj[x][i];
        if(level[x]+1==level[y] && capacity[x][y]-flow[x][y]>0){
            int f=dfs(y,min(pushed,capacity[x][y]-flow[x][y]));
            if(f!=0){
                flow[x][y]+=f;
                flow[y][x]-=f;
                return f;
            }
        }
    }
    return 0;
}

signed main(){
        fin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y,c;
        fin>>x>>y>>c;
        adj[x].push_back(y);
        adj[y].push_back(x);
        capacity[x][y]=c;
        //capacity[y][x]=0;
    }
    int max_flow=0;
    while(true){
        for(int i=1;i<=n;i++){
            level[i]=-1;
            ptr[i]=0;
        }
        level[1]=0;
        bfs();
        if(level[n]==-1){
            break;
        }
        int pushed=0;
        while(pushed=dfs(1,inf)){
            max_flow+=pushed;
        }
    }
        fout<<max_flow;
}