Pagini recente » Cod sursa (job #2932071) | Cod sursa (job #1964578) | Cod sursa (job #2875732) | Cod sursa (job #1431391) | Cod sursa (job #988751)
Cod sursa(job #988751)
#include <fstream>
#include <vector>
#include <algorithm>
#define ds (u[v[i][j]])
#define sd (u[rv[i][j]])
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
struct edge{
edge(int a,int b,int c,int d):fro(a),to(b),flo(c),mxf(d),usd(0){}
int fro,to,flo,mxf,usd;
};
int n,m,s,fnd=1;
vector<int> v[1001],rv[1001];
vector<edge> u;
vector<int> sl,sln;
void max_flow(int i){
if(i==n){
int mn=*min_element(sl.begin(),sl.end());
for(unsigned j=0;j<sln.size();j++)
u[sln[j]].flo+=u[sln[j]].usd*mn;
s+=mn;
fnd=1;
return;
}
for(unsigned j=0;j<v[i].size()&&!fnd;j++)
if(!ds.usd&&ds.flo<ds.mxf){
ds.usd=1;
sl.push_back(ds.mxf-ds.flo);
sln.push_back(v[i][j]);
max_flow(ds.to);
ds.usd=0;
sl.pop_back();
sln.pop_back();
}
for(unsigned j=0;j<rv[i].size()&&!fnd;j++)
if(!sd.usd&&ds.flo){
sd.usd=-1;
sl.push_back(ds.flo);
sln.push_back(rv[i][j]);
max_flow(ds.fro);
ds.usd=0;
sl.pop_back();
sln.pop_back();
}
return;
}
int main()
{
f>>n>>m;
for(int i=1;i<=m;i++){
int x,y,flo;
f>>x>>y>>flo;
u.push_back(edge(x,y,0,flo));
v[x].push_back(u.size()-1);
rv[x].push_back(u.size()-1);
}
while(fnd){
fnd=0;
max_flow(1);
}
g<<s;
return 0;
}