Cod sursa(job #357423)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 19 octombrie 2009 11:34:02
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 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, 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 i;

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

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

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

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

int check0( int nod ) {

    for( ; nod != 1; nod = tat[ nod ] )
        if( !cst[ tat[ nod ] ][ nod ] )
            return 0;

    return 1;
}

int check1( int nod ) {

    int aux;

    for( aux = n; aux != nod; aux = tat[ aux ] )
        if( !cst[ tat[ nod ] ][ nod ] || aux == 1 )
            return 0;

    return 1;
}

void read() {

    int i, x0, y0, cst0;

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

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

void solve() {

    int cnt, flx, nod, fmin;

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

        for( unsigned int i = 0; i < vec[ n ].sz; ++i ) {

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

                tat[ n ] = nod;
                fmin = INF;
                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;
                    }
                    flx += fmin;
                }
            }
        }
        for( int i = 1; i <= m; ++i )
            if( check0( muc[ i ].x ) && check1( muc[ i ].y ) ) {

                muc[ i ].frecv = 1;
                ++cnt;
            }
    }
    printf( "%d\n", cnt );
    for( int 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;
}