Cod sursa(job #323352)

Utilizator syntax_errorGustav Matula syntax_error Data 11 iunie 2009 21:11:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#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;
}