Cod sursa(job #323343)

Utilizator syntax_errorGustav Matula syntax_error Data 11 iunie 2009 20:48:02
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>

using namespace std;
typedef vector< int > :: iterator vit;

#define MAXN 1024

int N, M, S, T;

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( S );
      
      dad[ S ] = -2;
      
      while( !Q.empty() && dad[ T ] == -1 ) {
         int c = Q.front(); Q.pop();
         for( vit i = G[c].begin(); i != G[c].end(); ++i ) 
            if( dad[ *i ] == -1 && cap[ c ][ *i ] ) {
               dad[ *i ] = c; Q.push( *i );
            }
      }
      
      if( dad[ T ] == -1 ) break;
      
      for( int i = 0; i < N; ++i ) 
         if( cap[ i ][ T ] && dad[ i ] != -1 ) {
            int bot = cap[ i ][ T ];
            
            for( int son = i; dad[ son ] >= 0; son = dad[ son ] )
               bot = min( bot, cap[ dad[ son ] ][ son ] );
            
            if( !bot ) continue;
            
            for( int son = i; dad[ son ] >= 0; son = dad[ son ] ) {
               cap[ dad[ son ] ][ son ] -= bot;
               cap[ son ][ dad[ son ] ] += bot;
            }
            
            cap[ i ][ T ] -= bot;
            cap[ T ][ 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 ) {
      int A, B, W; 
      scanf( "%d%d%d", &A, &B, &W ); --A; --B;
      
      G[ A ].push_back( B );
      G[ B ].push_back( A );
      
      cap[ A ][ B ] = W;
   }  
   
   S = 0; T = N-1;
   
   printf( "%d\n", Dinic() ); 
   
   return 0;
}