Pagini recente » Cod sursa (job #1989776) | Cod sursa (job #1554903) | Cod sursa (job #434365) | Cod sursa (job #1538763) | Cod sursa (job #323352)
Cod sursa(job #323352)
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef vector< int > :: iterator vit;
#define MAXN 1024
int N, M;
int A, B, C;
queue< int > Q;
int dad[ MAXN ];
int cap[ MAXN ][ MAXN ];
vector< int > G[ MAXN ];
inline int Dinic() {
int maxflow = 0;
for( ; ; ) {
memset( dad, -1, sizeof dad );
while( !Q.empty() ) Q.pop();
Q.push( 0 );
while( !Q.empty() && dad[ N-1 ] == -1 ) {
int c = Q.front(); Q.pop();
for( vit i = G[c].begin(); i != G[c].end(); ++i ) {
if( cap[ c ][ *i ] <= 0 ) continue;
if( dad[ *i ] != -1 ) continue;
dad[ *i ] = c; Q.push( *i );
}
}
if( dad[ N-1 ] == -1 ) break;
for( int i = 0; i < N; ++i ) {
if( cap[i][N-1] <= 0 ) continue;
if( dad[ i ] == -1 ) continue;
int bot = cap[ i ][ N-1 ];
for( int j = i; j != 0; j = dad[ j ] )
bot = min( bot, cap[ dad[j] ][ j ] );
if( !bot ) continue;
for( int j = i; j != 0; j = dad[ j ] ) {
cap[ dad[ j ] ][ j ] -= bot;
cap[ j ][ dad[ j ] ] += bot;
}
cap[ i ][ N-1 ] -= bot;
cap[ N-1 ][ i ] += bot;
maxflow += bot;
}
}
return maxflow;
}
int main( void )
{
freopen( "maxflow.in", "r", stdin );
freopen( "maxflow.out", "w", stdout );
scanf( "%d%d", &N, &M );
for( int i = 0; i < M; ++i ) {
scanf( "%d%d%d", &A, &B, &C ); --A; --B;
G[ A ].push_back( B );
G[ B ].push_back( A );
cap[ A ][ B ] = C;
}
printf( "%d\n", Dinic() );
return 0;
}