Cod sursa(job #2562458)

Utilizator a.zadgorsky@gmail.com0882517140 [email protected] Data 29 februarie 2020 14:36:06
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <fstream>
using namespace std;
struct ed{
    int to, c, r;
};
vector <ed> nbrs[1024];
int m, n, s, t, res, ans;
int lev[1024], firstInd[1024];
int dfs(int seg, int flow){
    int leftFlow=flow;
    if(seg==t){
        return flow;
    }
    int k;
    for(int i=firstInd[seg];i<nbrs[seg].size();i++){
        int next=nbrs[seg][i].to;
        if(lev[next]>lev[seg] and nbrs[seg][i].c>0){
            k=dfs(next, min(leftFlow, nbrs[seg][i].c));
            if(k==0 or k==nbrs[seg][i].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));
    int otg=dfs(s, 100000000);
    return otg;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
#define cin myFileIn
ifstream myFileIn;
myFileIn.open("maxflow.in");
#define cout myFileOut
ofstream myFileOut;
myFileOut.open("maxflow.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;
}