Cod sursa(job #2380846)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 15 martie 2019 16:13:51
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <bits/stdc++.h>
#define vecin v [ nod ][ i ]
using namespace std ;
const int NR = 1005 ;
const int oo = 110005 ;
ifstream in ("maxflow.in") ;
ofstream out ("maxflow.out") ;

vector < int > v [ NR ] ;
int n , m , x , y , c , d [ NR ][ NR ] , TT [ NR ] , pos , flow , sol ;
bool viz [ NR ] ;

bool bfs () {

    int i , nod ;
    queue < int > q ;

    for ( i = 1 ; i <= n ; ++ i )   TT [ i ] = 0 , viz [ i ] = 0 ;
    q.push( 1 ) ;
    viz [ 1 ] = 1 ;
    while ( !q.empty() && !viz [ n ] )    {

        nod = q.front() ;
        q.pop() ;
        viz [ nod ] = 1 ;
        for ( size_t i = 0 ; i < v [ nod ].size() ; i ++ )  {

            if ( !viz [ vecin ] && d [ nod ][ vecin ] > 0 ) {

                TT [ vecin ] = nod ;
                viz [ vecin ] = 1 ;
                q.push( vecin ) ;
            }
        }
    }
    return viz [ n ] ;
}

int main () {
     in >> n >> m ;
     while ( m -- ) {

        in >> x >> y >> c ;
        v [ x ].push_back( y ) ;
        v [ y ].push_back( x ) ;
        d [ x ][ y ] = c ;
     }
     while ( bfs () )   {
        for ( size_t i = 0 ; i < v [ n ].size() ; i ++ )     {

            if ( viz [ v [ n ][ i ] ] && d [ v [ n ][ i ] ][ n ] > 0 )    {

                pos = n ;
                flow = oo ;
                while ( TT [ pos ] )    {
                    flow = min ( flow , d [ TT [ pos ] ][ pos ] ) ;
                    pos = TT [ pos ] ;
                }
                sol += flow ;
                pos = n ;
                   while ( TT [ pos ] )    {
                    d [ TT[ pos ] ][ pos ] -= flow ;
                    d [ pos ][ TT[ pos ] ] += flow ;
                    pos = TT [ pos ] ;
                }
            }
        }
     }
    out << sol ;
}