Pagini recente » Cod sursa (job #2933277) | Cod sursa (job #606632) | Cod sursa (job #832810) | Cod sursa (job #2407898) | Cod sursa (job #988596)
Cod sursa(job #988596)
#include <fstream>
#include <vector>
#include <algorithm>
#define ds (v[i][j])
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
struct crd{
crd(int a,int b):x(a),y(b){}
int x,y;
};
int n,m,s;
vector<int> v[1001],rv[1001],fl[1001];
bool vs[1001];
int a[1001][1001];
vector<int> sl;
vector<crd> inc;
vector<bool> wt;
void max_flow(int i){
if(i==n){
int mn=*min_element(sl.begin(),sl.end());
for(unsigned j=0;j<inc.size();j++){
if(wt[j])
a[inc[j].x][inc[j].y]+=mn;
else
a[inc[j].x][inc[j].y]-=mn;
}
s+=mn;
return;
}
for(unsigned j=0;j<v[i].size();j++){
if(!vs[ds]&&a[i][ds]<fl[i][j]){
vs[ds]=1;
sl.push_back(fl[i][j]-a[i][ds]);
inc.push_back(crd(i,ds));
wt.push_back(1);
max_flow(ds);
vs[ds]=0;
sl.pop_back();
inc.pop_back();
wt.pop_back();
}
}
for(unsigned j=0;j<rv[i].size();j++){
if(!vs[ds]&&a[ds][i]){
vs[ds]=1;
sl.push_back(a[ds][i]);
inc.push_back(crd(ds,i));
wt.push_back(0);
max_flow(ds);
vs[ds]=0;
sl.pop_back();
inc.pop_back();
wt.pop_back();
}
}
return;
}
int main()
{
f>>n>>m;
for(int i=1;i<=m;i++){
int x,y,flo;
f>>x>>y>>flo;
v[x].push_back(y);
rv[y].push_back(x);
fl[x].push_back(flo);
}
max_flow(1);
g<<s;
return 0;
}