Pagini recente » Cod sursa (job #483255) | Cod sursa (job #1898318) | Cod sursa (job #2892242) | Cod sursa (job #2071951) | Cod sursa (job #1789295)
#include<fstream>
#include<cstring>
#include<vector>
#include<deque>
#define DIM 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int x, y, cant, n, m, C[DIM][DIM], F[DIM][DIM], t[DIM], viz[DIM], sol;
vector<int> v[DIM];
deque<int> d;
int bfs(){
int ok = 0;
memset( viz, 0, sizeof(viz) );
viz[1] = 1;
t[1] = 0;
d.push_back( 1 );
while( !d.empty() ){
int nod = d.front();
if( nod == n ){
ok = 1;
}
for( int i = 0; i < v[nod].size(); i++ ){
int fiu = v[nod][i];
if( viz[fiu] == 0 && C[nod][fiu] > F[nod][fiu] ){
d.push_back(fiu);
viz[fiu] = 1;
t[fiu] = nod;
}
}
d.pop_front();
}
return ok;
}
int main(){
fin >> n >> m;
for( int i = 1; i <= m; i++ ){
fin >> x >> y >> cant;
v[x].push_back( y );
C[x][y] = cant;
v[y].push_back( x );
}
while( bfs() == 1 ){
for( int j = 0; j < v[n].size(); j++ ){
int nod = v[n][j];
if( viz[nod] == 1 && C[nod][n] > F[nod][n] ){
int minim = C[nod][n] - F[nod][n];
for( int i = nod; t[i] != 0; i = t[i] ){
minim = min( minim, C[t[i]][i] - F[t[i]][i] );
}
F[nod][n] += minim;
F[n][nod] -= minim;
for( int i = nod; t[i] != 0; i = t[i] ){
F[t[i]][i] += minim;
F[i][t[i]] -= minim;
}
sol += minim;
}
}
}
fout << sol << "\n";
return 0;
}