Cod sursa(job #2782330)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 12 octombrie 2021 10:25:36
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 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 start[nmax];
int n,m;
bool levelG(){
    int q[nmax];
    int primulQ=0;
    int ultimulQ=0;
    memset(level,0,sizeof(level));
    q[ultimulQ++]=1;
    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(;start[nod]<vecini[nod].size();start[nod]++){
        int i=vecini[nod][start[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()){
        memset(start,0,sizeof(start));
        int t=1;
        while(t){
            t=pushF(1,INT_MAX);
            sum+=t;
        }
    }
    out<<sum;
}