Cod sursa(job #360265)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 30 octombrie 2009 18:52:00
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <algorithm>
#include <vector>
using namespace std;

#define DIM ( 1<<8 )
#define INF ( 1<<30 )
#define pb push_back
#define sz size()

int n, rez, cd[ DIM*DIM ], tat[ DIM ], val[ DIM ], viz[ DIM ], cst[ DIM ][ DIM ], flx[ DIM ][ DIM ];
int S, D;
vector< int > vec[ DIM ];

void init_tat() {

    int i;

    for( i = 0; i <= 2*n+1; ++i )
        tat[ i ] = -1;
}

void init_val() {

    int i;

    for( i = 0; i <= 2*n+1; ++i )
        val[ i ] = INF;
}

void init_viz() {

    int i;

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

int bellman_ford() {

    int st, dr, aux, nod;
    unsigned int i;

    init_tat();
    init_val();
    init_viz();
    cd[ 0 ] = S;
    val[ S ] = 0;
    viz[ S ] = 1;
    for( st = dr = 0; st <= dr; ++st ) {

        nod = cd[ st ];
        viz[ nod ] = 0;
        for( i = 0; i < vec[ nod ].sz; ++i ) {

            aux = vec[ nod ][ i ];
            if( val[ nod ] + cst[ nod ][ aux ] < val[ aux ] && flx[ nod ][ aux ] > 0 ) {

                if( !viz[ aux ] ) {

                    viz[ aux ] = 1;
                    cd[ ++dr ] = aux;
                }
                val[ aux ] = val[ nod ] + cst[ nod ][ aux ];
                tat[ aux ] = nod;
            }
        }
    }
    if( val[ D ] != INF )
        return 1;

    return 0;
}

void read() {

    int i, j, cst0;

    scanf( "%d", &n );
    S = 0;
    D = 2*n+1;
    for( i = 1; i <= n; ++i ) {

        vec[ S ].pb( i );
        vec[ i ].pb( S );
        flx[ S ][ i ] = 1;
        for( j = 1; j <= n; ++j ) {

            scanf( "%d", &cst0 );
            cst[ i ][ j+n ] = cst0;
            cst[ j+n ][ i ] = -cst0;

            flx[ i ][ j+n ] = 1;

            vec[ i ].pb( j+n );
            vec[ j+n ].pb( i );
        }
    }
}

void solve() {

    int i, nod, fmin;

    for( i = n+1; i <= 2*n; ++i ) {

        vec[ i ].pb( D );
        vec[ D ].pb( i );
        flx[ i ][ D ] = 1;
    }
    while( bellman_ford() ) {

        fmin = INF;
        for( nod = D; nod != S; nod = tat[ nod ] )
            fmin = min( fmin, flx[ tat[ nod ] ][ nod ] );
        for( nod = D; nod != S; nod = tat[ nod ] ) {

            flx[ tat[ nod ] ][ nod ] -= fmin;
            flx[ nod ][ tat[ nod ] ] += fmin;
        }
        rez += fmin*val[ D ];
    }
    printf( "%d", rez );
}

int main() {

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

    read();
    solve();

    return 0;
}