Cod sursa(job #1301086)

Utilizator xtreme77Patrick Sava xtreme77 Data 25 decembrie 2014 16:08:51
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
/*
 * Code by Spiromanul
 * X-MAS Edition
 * MERRY X-MAS TO EVERYONE
 */

#include <fstream>
#include <bitset>
#include <vector>
#include <queue>

const char IN [ ] = "maxflow.in" ;
const char OUT [ ] = "maxflow.out" ;
const int MAX = 1111 ;

#define pb push_back

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

vector < int > gr [ MAX ] ;

int cap [ MAX ] [ MAX ] , did [ MAX ] [ MAX ] , tata [ MAX ] ;

bitset < MAX > viz ;

inline bool BFS ( int n ) ;

int main(   )
{
    int n , m ;
    fin >> n >> m ;
    for ( ; m ; -- m )
    {
        int x , y , cost ;
        fin >> x >> y >> cost ;
        cap [ x ] [ y ] += cost ;
        gr [ x ].pb ( y ) ;
        gr [ y ].pb ( x ) ;
    }
    int flux = 0 ;
    for ( ; BFS ( n ) ; )
    {
        for ( auto x : gr [ n ] )
        {
            if ( cap [ x ] [ n ] == did [ x ] [ n ] or viz [ x ] == 0 ) continue ;
            tata [ n ] = x ;

            int local = 1 << 30 ;
            for ( int j = n ; j != 1 ; j = tata [ j ] )
                local = min ( local , cap [ tata [ j ] ] [ j ] - did [ tata [ j ] ] [ j ] ) ;

            if ( ! local ) continue ;

            for ( int j = n ; j != 1 ; j = tata [ j ] )
            {
                did [ tata [ j ] ] [ j ]  += local ;
                did [ j ] [ tata [ j ] ] -= local ;
            }

            flux += local ;
        }
    }
    fout << flux ;
    return 0;
}

inline bool BFS ( int n )
{
    queue < int > Q ;
    Q.push ( 1 ) ;
    viz.reset ( ) ;
    viz [ 1 ] = 1 ;
    for ( ; !Q.empty ( ) ; )
    {
        int fata = Q.front ( ) ;
        Q.pop ( ) ;
        if ( fata == n )
            continue ;
        for ( auto x : gr [ fata ] )
        {
            if ( cap [ fata ] [ x ] == did [ fata ] [ x ] or viz [ x ] ) continue ;
            viz [ x ] = 1 ;
            tata [ x ] = fata ;
            Q.push ( x ) ;
        }
    }

    return viz [ n ] ;

}