Cod sursa(job #2782198)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 11 octombrie 2021 21:04:15
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define nmax 1001
using namespace std;
string prob="maxflow";
ifstream in(prob+".in");
ofstream out(prob+".out");
vector<int> vecini[nmax];
int adj[nmax][nmax];
int level[nmax];
int n,m;
bool levelG(){
    int q[nmax];
    int primulQ=0;
    int ultimulQ=0;
    q[ultimulQ++]=1;
    for(int i=1;i<nmax;i++)level[i]=0;
    while(primulQ!=ultimulQ){
        int nod=q[primulQ++];
        if(nod==n)return 1;
        for(auto i:vecini[nod]){
            if(adj[nod][i]&&!level[i]&&i!=1){
                level[i]=level[nod]+1;
                q[ultimulQ++]=i;
            }
        }
    }
    return 0;
}
int pushF(int nod,int minn){
    if(nod==n)return minn;
    for(auto i:vecini[nod]){
        if((level[nod]+1==level[i])&&adj[nod][i]){
            int tmp=pushF(i,min(minn,adj[nod][i]));
            if(tmp){
                adj[nod][i]-=tmp;
                adj[i][nod]+=tmp;
                return tmp;
            }
        }
    }
    return 0;
}
int main(){
    in>>n>>m;
    int x,y,z;
    while(m--){
        in>>x>>y>>z;
        vecini[x].push_back(y);
        vecini[y].push_back(x);
        adj[x][y]=z;
    }
    int sum=0;
    while(levelG()){
        int t=1;
        while(t){
            t=pushF(1,INT_MAX);
            sum+=t;
        }
    }
    out<<sum;
}