Cod sursa(job #359983)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 29 octombrie 2009 11:00:09
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include <algorithm>
#include <vector>
using namespace std;

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

int e, n, m, cuplaj;
int D, S;
int cd[ DIM ], tat[ DIM ], viz[ DIM ], cst[ DIM ][ DIM ];
vector<int> vec[ DIM ];

void init_viz() {

    int i;

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

int bf() {

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

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

            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[ D ];
}

void read() {

    int i, x0, y0;

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

        scanf( "%d %d", &x0, &y0 );

        vec[ x0 ].pb( y0+n );
        vec[ y0+n ].pb( x0 );
        cst[ x0 ][ y0+n ] = 1;

        vec[ S ].pb( x0 );
        vec[ x0 ].pb( S );
        cst[ S ][ x0 ] = 1;

        vec[ D ].pb( y0+n );
        vec[ y0+n ].pb( D );
        cst[ y0+n ][ D ] = 1;
    }
}

void solve() {

    int nod, fmin;
    unsigned int i;

    for( cuplaj = 0; bf(); )
        for( i = 0; i < vec[ D ].sz; ++i ) {

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

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

                    for( nod = D; nod != S; nod = tat[ nod ] ) {

                        cst[ tat[ nod ] ][ nod ] -= fmin;
                        cst[ nod ][ tat[ nod ] ] += fmin;
                    }
                    ++cuplaj;
                }
            }
        }
}

void print() {

    freopen( "cuplaj.in", "r", stdin );

    int i, x0, y0;

    scanf( "%d %d %d", &n, &m, &e );
    printf( "%d\n", cuplaj );
    for( i = 0; i < e; ++i ) {

        scanf( "%d %d", &x0, &y0 );
        if( !cst[ x0 ][ y0+n ] )
            printf( "%d %d\n", x0, y0 );
    }
}

int main() {

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

    read();
    solve();
    print();

    return 0;
}