Pagini recente » Cod sursa (job #2568739) | Cod sursa (job #884486) | Cod sursa (job #2463163) | Cod sursa (job #1362957) | Cod sursa (job #1398319)
#include <fstream>
#include <vector>
#include <queue>
#define DIM 1005
#define minim(a, b) ((a)<(b)?a:b)
using namespace std;
int answer, n, m, vfc, vecin, viz[DIM], cap[DIM][DIM], flux[DIM][DIM], better, drum[DIM];
queue <int> q;
vector <int> edges[DIM];
int bf(){
vfc=1;
for(int i=1; i<=n; ++i) viz[i]=0;
viz[vfc]=1;
q.push(vfc);
while(!q.empty()){
vfc=q.front();
q.pop();
if(vfc==n)
continue;
for(int i=0; i<edges[vfc].size(); ++i){
vecin=edges[vfc][i];
if(!viz[edges[vfc][i]]&&cap[vfc][vecin]-flux[vfc][vecin]>0){
viz[vecin]=1;
q.push(vecin);
drum[vecin]=vfc;
}
}
}
return viz[n];
}
int main()
{
ifstream in ("maxflow.in");
ofstream out ("maxflow.out");
int a, b;
in>>n>>m;
for(int i=1; i<=m; ++i){
in>>a>>b;
in>>cap[a][b];
edges[a].push_back(b);
edges[b].push_back(a);
}
while(bf()){
for(int i=0; i<edges[n].size(); ++i){
vecin=edges[n][i];
if(!viz[vecin]||flux[vecin][n]==cap[vecin][n]) continue;
vfc=vecin;
better=cap[vecin][n]-flux[vecin][n];
while(vfc!=1){
better=minim(better, cap[drum[vfc]][vfc]-flux[drum[vfc]][vfc]);
vfc=drum[vfc];
}
if(!better) continue;
flux[vecin][n]+=better;
flux[n][vecin]-=better;
vfc=vecin;
while(vfc!=1){
flux[drum[vfc]][vfc]+=better;
flux[vfc][drum[vfc]]-=better;
vfc=drum[vfc];
}
answer+=better;
}
}
out<<answer<<"\n";
in.close();
out.close();
return 0;
}