Cod sursa(job #323328)

Utilizator syntax_errorGustav Matula syntax_error Data 11 iunie 2009 19:49:30
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>

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

#define MAXN 1024

int N, M;

queue< int > Q;

int dad[ MAXN ];
int cap[ MAXN ][ MAXN ];

vector< int > G[ MAXN ];

inline int Dinic() {
   int flow = 0;
   
   for( ; ; ) {
      memset( dad, -1, sizeof dad );
      while( !Q.empty() ) Q.pop();
      
      Q.push( 1 );
      
      while( !Q.empty() ) {
         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 ) break;
      
      for( int i = 1; i <= N; ++i ) {
         if( cap[i][N] == 0 ) continue;
         if( dad[i] == -1 ) continue;
         
         int bot = cap[i][N];
         
         for( int son = i; son != 1; son = dad[ son ] )
            bot = min( bot, cap[ dad[ son ] ][ son ] );
         for( int son = i; son != 1; son = dad[ son ] ) {
            cap[ dad[ son ] ][ son ] -= bot;
            cap[ son ][ dad[ son ] ] += bot;
         }
         
         cap[ i ][ N ] -= bot;
         cap[ N ][ i ] += bot;
         
         flow += bot;
      }
   }
   
   return flow;
}

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 );
      
      G[ A ].push_back( B );
      G[ B ].push_back( A );
      
      cap[ A ][ B ] = W;
      cap[ B ][ A ] = 0;
   }  
   
   printf( "%d\n", Dinic() ); 
   
   return 0;
}