Pagini recente » Cod sursa (job #721967) | Cod sursa (job #3122103) | Cod sursa (job #431) | Cod sursa (job #2031099) | Cod sursa (job #428809)
Cod sursa(job #428809)
#include<fstream>
#include<vector>
#define MAX 100000
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int> v[1001];
int n,m,S,T,flow,minim;
int c[1001][1001],f[1001][1001],x[1001],t[1001],pus[1001],r[1001];
int bf()
{ int st=1,dr=1,i,nod;
unsigned int j;
for(i=1;i<=T;i++)
{ t[i]=0;
pus[i]=0;
x[i]=0;
}
x[1]=S;
pus[S]=1;
r[S]=MAX;
while(st<=dr)
{ nod=x[st];
for(j=0;j<v[x[st]].size();j++)
{ i=v[nod][j];
if(pus[i]==0)
{ if(c[nod][i]!=f[nod][i])
{ pus[i]=1;
t[i]=nod;
if(i==T) return 1;
else x[++dr]=i;
}
}
}
st++;
}
return 0;
}
void flux()
{ while(bf())
{ int j,i,k;
for(j=0;j<(int)v[n].size();j++)
{ i=v[n][j];
if(c[i][n]!=f[i][n]&&pus[i])
{ t[n]=i;
minim=MAX;
k=T;
while(k!=S)
{ minim=min(minim,c[t[k]][k]-f[t[k]][k]);
k=t[k];
}
k=T;
while(k!=S)
{ f[t[k]][k]+=minim;
f[k][t[k]]-=minim;
k=t[k];
}
flow+=minim;
}
}
}
}
int main()
{ int i,x,y,z;
fin>>n>>m;
for(i=1;i<=m;i++)
{ fin>>x>>y>>z;
c[x][y]=z;
v[x].push_back(y);
v[y].push_back(x);
}
S=1;
T=n;
flux();
fout<<flow;
fin.close();
fout.close();
return 0;
}