Pagini recente » Cod sursa (job #457092) | Istoria paginii utilizator/caraianioana | Cod sursa (job #1423040) | Cod sursa (job #5744) | Cod sursa (job #2562458)
#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;
}