Cod sursa(job #1969993)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 18 aprilie 2017 19:36:45
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;

#define NMAX 1001
#define INFI 0x3f3f3f3f3f

vector < int > V[ NMAX ];
queue < int > Q;

int D[ NMAX ][ NMAX ];
int F[ NMAX ][ NMAX ];
int Tata[ NMAX ];
int Viz[ NMAX ];

int BFS ( int n ) {

    int i, nod, fiu;

    for ( i = 1; i <= n; ++i )
        Tata[ i ] = Viz[ i ] = 0;

    Q.push( 1 );
    Viz[ 1 ] = 1;

    while ( !Q.empty() ) {
        nod = Q.front();
        Q.pop();
        if ( nod == n ) continue;
        for ( i = 0; i < V[ nod ].size(); ++i ) {
            fiu = V[ nod ][ i ];
            if ( Viz[ fiu ] || D[ nod ][ fiu ] == F[ nod ][ fiu ] ) continue ;
            Q.push( fiu );
            Viz[ fiu ] = 1;
            Tata[ fiu ] = nod;
        }
    }

    return Viz[ n ];

}

int main () {

    freopen( "maxflow.in", "r", stdin );
    freopen( "maxflow.out", "w", stdout );

    int n, m, i, j, x, y, c, nod, mini, flow;

    scanf( "%d%d",&n,&m );
    while ( m-- ) {
        scanf( "%d%d%d",&x,&y,&c );
        D[ x ][ y ] += c;
        V[ x ].push_back ( y );
        V[ y ].push_back ( x );
    }

    flow = 0;
    BFS( n );

    while ( BFS( n ) ) {
        for ( i = 0; i < V[ n ].size(); ++i ) {
            nod = V[ n ][ i ];
            if ( F[ nod ][ n ] == D[ nod ][ n ] || !Viz[ nod ] ) continue ;

            Tata[ n ] = nod;
            mini = INFI;
            for ( j = n; j != 1; j = Tata[ j ] )
                mini = min ( mini, D[ Tata[ j ] ][ j ] - F[ Tata[ j ] ][ j ] );

            if ( mini == 0 ) continue ;
            flow += mini;

            for ( j = n; j != 1; j = Tata[ j ] ) {
                F[ Tata[ j ] ][ j ] += mini;
                F[ j ][ Tata[ j ] ] -= mini;
            }
        }

    }

    printf( "%d ",flow );

    return 0;
}