Pagini recente » Cod sursa (job #1726992) | Cod sursa (job #2806483) | Cod sursa (job #1302259) | Cod sursa (job #2693676) | Cod sursa (job #1969993)
#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
#define NMAX 1001
#define INFI 0x3f3f3f3f3f
vector < int > V[ NMAX ];
queue < int > Q;
int D[ NMAX ][ NMAX ];
int F[ NMAX ][ NMAX ];
int Tata[ NMAX ];
int Viz[ NMAX ];
int BFS ( int n ) {
int i, nod, fiu;
for ( i = 1; i <= n; ++i )
Tata[ i ] = Viz[ i ] = 0;
Q.push( 1 );
Viz[ 1 ] = 1;
while ( !Q.empty() ) {
nod = Q.front();
Q.pop();
if ( nod == n ) continue;
for ( i = 0; i < V[ nod ].size(); ++i ) {
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, j, x, y, c, nod, mini, flow;
scanf( "%d%d",&n,&m );
while ( m-- ) {
scanf( "%d%d%d",&x,&y,&c );
D[ x ][ y ] += c;
V[ x ].push_back ( y );
V[ y ].push_back ( x );
}
flow = 0;
BFS( n );
while ( BFS( n ) ) {
for ( i = 0; i < V[ n ].size(); ++i ) {
nod = V[ n ][ i ];
if ( F[ nod ][ n ] == D[ nod ][ n ] || !Viz[ nod ] ) continue ;
Tata[ n ] = nod;
mini = INFI;
for ( 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 ( j = n; j != 1; j = Tata[ j ] ) {
F[ Tata[ j ] ][ j ] += mini;
F[ j ][ Tata[ j ] ] -= mini;
}
}
}
printf( "%d ",flow );
return 0;
}