Pagini recente » Cod sursa (job #2077939) | Cod sursa (job #2419627) | Cod sursa (job #1694353) | Cod sursa (job #1998333) | Cod sursa (job #2425505)
#include <iostream>
#include <vector>
#include <cstdio>
#include <queue>
using namespace std;
const int INFI = 0x3f3f3f;
const int NMAX = 1001;
vector < int > V[ NMAX ];
int D[ NMAX ][ NMAX ],
F[ NMAX ][ NMAX ],
Tata[ NMAX ],
Viz[ NMAX ];
int BFS ( int start, int n ) {
for ( int i = 0; i <= n; ++i ) {
Tata[ i ] = Viz[ i ] = 0;
}
Viz[ start ] = 1;
queue < int > Q;
Q.push( start );
while ( !Q.empty() ) {
int nod = Q.front();
Q.pop();
if ( nod == n ) continue;
for ( int i = 0; i < V[ nod ].size(); ++i ) {
int fiu = V[ nod ][ i ];
if ( Viz[ fiu ] || D[ nod ][ fiu ] == F[ nod ][ fiu ] ) continue ;
Q.push( fiu );
Viz[ fiu ] = 1;
Tata[ fiu ] = nod;
}
}
return Viz[ n ];
}
int main () {
freopen( "maxflow.in", "r", stdin );
freopen( "maxflow.out", "w", stdout );
int n, m, i, x, y, c;
scanf( "%d%d", &n,&m );
while ( m-- ) {
scanf( "%d%d%d", &x,&y,&c );
V[ x ].push_back( y );
V[ y ].push_back( x );
D[ x ][ y ] += c;
}
int flow = 0;
while ( BFS( 1, n ) ) {
int nod;
for ( int i = 0; i < V[ n ].size(); ++i ) {
nod = V[ n ][ i ];
if ( F[ nod ][ n ] == D[ nod ][ n ] || !Viz[ nod ] ) continue;
Tata[ n ] = nod;
int mini = INFI;
for ( int j = n; j != 1; j = Tata[ j ] )
mini = min( mini, D[ Tata[ j ] ][ j ] - F[ Tata[ j ] ][ j ] );
if ( mini == 0 ) continue ;
flow += mini;
for ( int j = n; j != 1; j = Tata[ j ] ) {
F[ Tata[ j ] ][ j ] += mini;
D[ j ][ Tata[ j ] ] -= mini;
}
}
}
printf( "%d", flow );
return 0;
}