Cod sursa(job #2918698)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 12 august 2022 17:24:28
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 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]));
            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){
        level[1]=0;
        for(int i=2;i<=n;i++){
            level[i]=-1;
        }
        bfs();
        if(level[n]==-1){
            break;
        }
        for(int i=1;i<=n;i++){
            ptr[i]=0;
        }
        int pushed=0;
        while(pushed=dfs(1,inf)){
            max_flow+=pushed;
        }
    }
        fout<<max_flow;
}