Cod sursa(job #357590)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 19 octombrie 2009 20:30:39
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.47 kb
#include <algorithm>
#include <vector>
using namespace std;

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

struct muchie {

    int x, y, frecv;
};

int n, m, dest, nrsol, cd[ DIM ], tat[ DIM ], viz[ DIM ], cst[ DIM ][ DIM ];
muchie muc[ 10*DIM ];
vector<int> vec[ DIM ];

inline int min( int x, int y ) {

    if( x < y )
        return x;

    return y;
}

void init_viz() {

    int i;

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

int bf() {

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

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

        nod = cd[ st ];
        if( nod != n ) {

            for( cnt = 0; cnt < vec[ nod ].sz; ++cnt ) {

                aux = vec[ nod ][ cnt ];
                if( !viz[ aux ] && cst[ nod ][ aux ] > 0 ) {

                    cd[ ++dr ] = aux;
                    tat[ aux ] = nod;
                    viz[ aux ] = 1;
                }
            }
        }
    }
    return viz[ n ];
}

int df( int nod ) {

    int aux;
    unsigned int cnt;

    if( nod == dest )
        return 1;

    for( cnt = 0; cnt < vec[ nod ].sz; ++cnt ) {

        aux = vec[ nod ][ cnt ];
        if( !viz[ aux ] && cst[ nod ][ aux ] > 0 ) {

            viz[ aux ] = 1;
            if( df( aux ) )
                return 1;
        }
    }
    return 0;
}

void read() {

    int i, cst0;

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

        scanf( "%d %d %d", &muc[ i ].x, &muc[ i ].y , &cst0 );
        cst[ muc[ i ].x ][ muc[ i ].y ] += cst0;
        cst[ muc[ i ].y ][ muc[ i ].x ] += cst0;
        vec[ muc[ i ].x ].pb( muc[ i ].y );
        vec[ muc[ i ].y ].pb( muc[ i ].x );
    }
}

void solve() {

    int i, nod, fmin;
    unsigned int cnt;

    while( bf() )
        for( cnt = 0; cnt < vec[ n ].sz; ++cnt ) {

            nod = vec[ n ][ cnt ];
            if( viz[ nod ] && cst[ nod ][ n ] > 0 ) {

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

                        cst[ tat[ nod ] ][ nod ] -= fmin;
                        cst[ nod ][ tat[ nod ] ] += fmin;
                    }
            }
        }
    for( i = 1; i <= m; ++i ) {

        if( !cst[ muc[ i ].x ][ muc[ i ].y ] ) {

            init_viz();
            dest = muc[ i ].x;
            if( df( 1 ) ) {

                init_viz();
                dest = n;
                if( df( muc[ i ].y ) ) {

                    ++nrsol;
                    muc[ i ].frecv = 1;
                }
            }
        }
        if( !cst[ muc[ i ].y ][ muc[ i ].x ] ) {

            init_viz();
            dest = muc[ i ].y;
            if( df( 1 ) ) {

                init_viz();
                dest = n;
                if( df( muc[ i ].x ) ) {

                    ++nrsol;
                    muc[ i ].frecv = 1;
                }
            }
        }
    }
    printf( "%d\n", nrsol );
    for( i = 1; i <= m; ++i )
        if( muc[ i ].frecv )
            printf( "%d\n", i );
}

int main() {

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

    read();
    solve();

    return 0;
}