Pagini recente » Cod sursa (job #2923853) | Cod sursa (job #1857279) | Cod sursa (job #3269991) | Cod sursa (job #377144) | Cod sursa (job #2492546)
#include<fstream>
#include<algorithm>
#include<deque>
#include<vector>
#include<cstring>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,minim,x,y,k,s;
int f[1010],T[1010];
int C[1010][1010],flux[1010][1010];
deque <int> coada;
vector <int> v[1010];
int bfs(){
memset(f,0,sizeof(f));
coada.push_back(1);
f[1]=1;
while(!coada.empty()){
int nod=coada.front();
for(int i=0; i<v[nod].size();i++){
int vecin=v[nod][i];
if(f[vecin]==0 && C[nod][vecin]>flux[nod][vecin]){
coada.push_back(vecin);
T[vecin]=nod;
f[vecin]=1;
}
}
coada.pop_front();
}
if(f[n]==1){
return 1;
}
else{
return 0;
}
}
int main(){
fin>>n>>m;
for(int i=1;i<=m;i++){
fin>>x>>y>>k;
v[x].push_back(y);
v[y].push_back(x);
C[x][y]=k;
}
while( bfs() ){
for(int i=0;i<v[n].size();i++){
int nod=v[n][i];
if(f[nod]==1 && C[nod][n]>flux[nod][n]){
int minim=C[nod][n]-flux[nod][n];
while(nod!=1){
minim=min(minim,C[T[nod]][nod]-flux[T[nod]][nod]);
nod=T[nod];
}
s+=minim;
nod=v[n][i];
flux[nod][n]+=minim;flux[n][nod]-=minim;
while(nod!=1){
flux[T[nod]][nod]+=minim;
flux[nod][T[nod]]-=minim;
nod=T[nod];
}
}
}
}
fout<<s;
return 0;
}