Cod sursa(job #355948)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 12 octombrie 2009 19:54:53
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <algorithm>
using namespace std;

#define DIM ( 1<<10 )
#define INF ( 1<<30 )

int n, m, cd[ DIM ], tat[ DIM ], viz[ DIM ], cst[ DIM ][ DIM ];

void init_cst() {

    int i, j;

    for( i = 1; i <= n; ++i )
        for( j = 1; j <= n; ++j )
            cst[ i ][ j ] = -1;
}

void init_viz() {

    int i;

    for( i = 1; i <= n; ++i )
        viz[ i ] = 0;
}

int bf() {

    int i, st, dr, nod;

    cd[ 0 ] = 1;
    viz[ 1 ] = 1;
    for( st = dr = 0; st <= dr; ++st ) {

        nod = cd[ st ];
        for( i = 2; i <= n; ++i )
            if( cst[ nod ][ i ] > 0 ) {

                viz[ i ] = 1;
                cd[ ++dr ] = i;
                tat[ i ] = nod;
                if( i == n )
                    return 1;
            }
    }
    return 0;
}

void read() {

    int i, x0, y0, flx0;

    scanf( "%d %d", &n, &m );
    init_cst();
    for( i = 0; i < m; ++i ) {

        scanf( "%d %d %d", &x0, &y0, &flx0 );
        cst[ x0 ][ y0 ] = flx0;
        cst[ y0 ][ x0 ] = 0;
    }
}

void solve() {

    int flx, nod, fmin;

    for( flx = 0; bf(); flx += fmin ) {

        fmin = INF;
        for( nod = n; nod != 1; nod = tat[ nod ] )
            fmin = min( fmin, cst[ tat[ nod ] ][ nod ] );
        for( nod = n; nod != 1; nod = tat[ nod ] ) {

            cst[ tat[ nod ] ][ nod ] -= fmin;
            cst[ nod ][ tat[ nod ] ] += fmin;
        }
    }
    printf( "%d", flx );
}

int main() {

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

    read();
    solve();

    return 0;
}