Cod sursa(job #2562445)

Utilizator a.zadgorsky@gmail.com0882517140 [email protected] Data 29 februarie 2020 14:24:35
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <fstream>
using namespace std;
struct ed{
    int to, c, r;
};
vector <ed> nbrs[10000];
int m, n, s, t, res, ans;
int lev[10000], firstInd[10000];
int dfs(int seg, int flow){
    int leftFlow=flow;
    if(seg==t){
        return flow;
    }
    int sbor=0, k;
    for(int i=firstInd[seg];i<nbrs[seg].size();i++){
        int next=nbrs[seg][i].to;
        if(lev[next]>lev[seg]){
            k=dfs(next, min(leftFlow, nbrs[seg][next].c));
            if(k==0 or k==nbrs[seg][next].c){
                firstInd[seg]=i+1;
            }
            leftFlow=leftFlow-k;
            nbrs[seg][i].c=nbrs[seg][i].c-k;
            nbrs[next][nbrs[seg][i].r].c=nbrs[next][nbrs[seg][i].r].c+k;
        }
        if(leftFlow==0){
            break;
        }
    }
    return flow-leftFlow;
}
int bfs(){
    memset(lev, -1, sizeof(lev));
    queue <int> q;
    q.push(s);
    lev[s]=0;
    while(!q.empty()){
        int seg=q.front();
        q.pop();
        if(seg==t){
            break;
        }
        for(int i=0;i<nbrs[seg].size();i++){
            int next=nbrs[seg][i].to;
            if(lev[next]==-1 and nbrs[seg][i].c>0){
                lev[next]=lev[seg]+1;
                q.push(next);
            }
        }
    }
    memset(firstInd, 0, sizeof(firstInd));
    return dfs(s, 100000000);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
#define cin myFileIn
ifstream myFileIn;
myFileIn.open("maxFlow_fast.in");
#define cout myFileOut
ofstream myFileOut;
myFileOut.open("maxFlow_fast.out");
cin>>n>>m;
for(int i=0;i<m;i++){
    int x, y, p, st, st1;
    cin>>x>>y>>p;
    x--;
    y--;
    st=nbrs[x].size();
    st1=nbrs[y].size();
    nbrs[x].push_back({y, p, st1});
    nbrs[y].push_back({x, 0, st});
}
s=0;
t=n-1;
res=bfs();
while(res>0){
    ans=ans+res;
    res=bfs();
}
cout<<ans;
return 0;
}