Pagini recente » Cod sursa (job #1502913) | Cod sursa (job #2368692) | Cod sursa (job #784255) | Cod sursa (job #2165058) | Cod sursa (job #1513207)
#include<fstream>
#include<vector>
#include<cstring>
#include<deque>
#define DIM 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int C[DIM][DIM],F[DIM][DIM],x,y,z,n,m,s[DIM],t[DIM];
vector<int> v[DIM];
deque<int> d;
int bfs(){
int ok=0;
memset(s,0,sizeof(s));
d.push_back(1);
s[1]=1;
while( !d.empty() ){
int nod=d[0];
for( int i=0 ; i < v[nod].size() ; i++ ){
int vecin = v[nod][i] ;
if( s[vecin] == 0 && C[nod][vecin] > F[nod][vecin] ){
d.push_back(vecin);
s[vecin] = 1;
t[vecin] = nod;
if( vecin == n ) ok=1;
}
}
d.pop_front();
}
return ok;
}
int minim,flux;
int main(){
fin>>n>>m;
for(int 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()==1 ){
for(int i=0 ; i < v[n].size() ; i++ ){
int vecin =v[n][i];
if( C[vecin][n] > F[vecin][n] && s[vecin] == 1 ){
minim=C[vecin][n]-F[vecin][n];
int p = vecin;
while( t[p] != 0 ){
if( C[ t[p] ][ p ] > F[ t[p] ][ p ] && s[ t[p] ] == 1 ){
minim=min( minim , C[ t[p] ][ p ] - F[ t[p] ][ p ] );
}
p = t[p];
}
flux+=minim;
F[vecin][n]+=minim;
F[n][vecin]-=minim;
p = vecin;
while( t[p] != 0 ){
F[p][t[p]]-=minim;
F[t[p]][p]+=minim;
p = t[p] ;
}
}
}
}
fout<<flux<<"\n";
return 0;
}