Pagini recente » Cod sursa (job #2688093) | Monitorul de evaluare | Cod sursa (job #1186044) | Istoria paginii problema/album | Cod sursa (job #1384225)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int Nmax = 1001;
vector<int> G[Nmax],C[Nmax],I[Nmax];
vector<int> Lf,Lfi;
int pr[Nmax],id[Nmax];
int N,M;
queue<int> q;
int bfs(){
for(int i=1;i<=N;i++) pr[i]=0;
q.push(1); pr[1]=1;
while(!q.empty()){
int x=q.front(); q.pop();
for(int i=0;i<G[x].size();i++){
if(!pr[G[x][i]] && C[x][i]>0){
pr[G[x][i]]=x;
id[G[x][i]]=i;
q.push(G[x][i]);
}
}
}
return pr[N]!=0;
}
int addpath(int x,int e){
int p=x,m=C[x][e];
if(!m) return 0;
while(pr[p]!=p){
m=min(m,C[pr[p]][id[p]]);
p=pr[p];
}
if(!m) return 0;
C[x][e]-=m;
C[G[x][e]][I[x][e]]+=m;
p=x;
while(pr[p]!=p){
C[pr[p]][id[p]]-=m;
C[p][I[pr[p]][id[p]]]+=m;
p=pr[p];
}
return m;
}
int main(){
in>>N>>M;
int x,y,c;
for(int i=1;i<=M;i++){
in>>x>>y>>c;
G[x].push_back(y);
G[y].push_back(x);
C[x].push_back(c);
C[y].push_back(0);
I[x].push_back(G[y].size()-1);
I[y].push_back(G[x].size()-1);
if(y==N){
Lf.push_back(x);
Lfi.push_back(G[x].size()-1);
}
}
int mf=0;
while(bfs())
for(int i=0;i<Lf.size();i++){
mf += addpath(Lf[i],Lfi[i]);
}
out<<mf<<'\n';
return 0;
}