Pagini recente » Cod sursa (job #430431) | Cod sursa (job #416876) | Cod sursa (job #786720) | Cod sursa (job #1229864) | Cod sursa (job #1516624)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define dim 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,i,c[dim][dim],f[dim][dim],viz[dim],nod,sol,t[dim],m,x,y,z,minim;
queue <int>q;
vector <int> v[dim];
int bfs(){
while(!q.empty()){
q.pop();
}
memset(viz,0,sizeof(viz));
q.push(1);
viz[1]=1;
while(!q.empty()){
int nod=q.front();
if(nod==n){
return 1;
}
for(int i=0;i<v[nod].size();i++){
int vec=v[nod][i];
if(viz[vec]==0 && c[nod][vec]>f[nod][vec]){
t[vec]=nod;
q.push(vec);
viz[vec]=1;
}
}
q.pop();
}
return 0;
}
int main(){
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=z;
}
while(bfs()){
for(i=0;i<v[n].size();i++){
nod= v[n][i];
if(viz[nod]){
minim=c[nod][n]-f[nod][n];
while(minim!=0 && t[nod]!=0){
minim=min(minim,c[t[nod]][nod]-f[t[nod]][nod]);
nod=t[nod];
}
if(minim){
nod=v[n][i];
c[nod][n]+=minim;
c[n][nod]-=minim;
sol+=minim;
while(t[nod]!=0){
f[t[nod]][nod]+=minim;
f[nod][t[nod]]-=minim;
nod=t[nod];
}
}
}
}
}
fout<<sol<<"\n";
return 0;
}