Cod sursa(job #355819)

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

#define DIM (1<<10)

int n, m, flx, min0, frc[ DIM ], muc[ DIM ][ DIM ];

int drum( int nod ) {

    int i;

    if( nod == n )
        return 1;

    for( i = 1; i <= n; ++i )
        if( muc[ nod ][ i ] > 0 && !frc[ i ] ) {

            min0 = min( min0, muc[ nod ][ i ] );
            if( drum( i ) ) {

                muc[ nod ][ i ] -= min0;
                muc[ i ][ nod ] += min0;
                return 1;
            }
        }
    return 0;
}

void init() {

    int i, j;

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

void read() {

    int i, x0, y0, flx0;

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

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

void solve() {

    int i, ok;

    do {

        ok = 0;
        frc[ 1 ] = 1;
        for( i = 2; i <= n; ++i )
            frc[ i ] = 0;
        for( i = 1; i <= n; ++i )
            if( muc[ 1 ][ i ] > 0 ) {

                min0 = muc[ 1 ][ i ];
                if( drum( i ) ) {

                    muc[ 1 ][ i ] -= min0;
                    muc[ i ][ 1 ] += min0;
                    flx += min0;
                    ok = 1;
                    i = n;
                }

            }
    }
    while( ok );
    printf( "%d", flx );
}

int main() {

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

    read();
    solve();

    return 0;
}