Cod sursa(job #360826)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 2 noiembrie 2009 10:41:22
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <algorithm>
#include <vector>
using namespace std;

#define DIM ( 1<<14 )
#define pb push_back
#define sz size()

int cuplaj;
int N, M, E;
int dr[ DIM ], st[ DIM ], viz[ DIM ];
vector< int > vec[ DIM ];

void init_viz() {

    int i;

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

int pairup( int nod ) {

    unsigned int I;

    if( viz[ nod ] )
        return 0;

    viz[ nod ] = 1;
    for( I = 0; I < vec[ nod ].sz; ++I )
        if( !dr[ vec[ nod ][ I ] ] ) {

            dr[ vec[ nod ][ I ] ] = nod;
            st[ nod ] = vec[ nod ][ I ];

            return 1;
        }
    for( I = 0; I < vec[ nod ].sz; ++I )
        if( pairup( dr[ vec[ nod ][ I ] ] ) ) {

            dr[ vec[ nod ][ I ] ] = nod;
            st[ nod ] = vec[ nod ][ I ];

            return 1;
        }

    return 0;
}

int main() {

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

    int i, ok, x0, y0;

    scanf( "%d %d %d", &N, &M, &E );
    for( i = 0; i < E; ++i ) {

        scanf( "%d %d", &x0, &y0 );
        vec[ x0 ].pb( y0 );
    }
    for( ok = 1; ok; ) {

        ok = 0;
        init_viz();
        for( i = 1; i <= N; ++i )
            if( !st[ i ] && pairup( i ) ) {

                ++cuplaj;
                ok = 1;
            }
    }
    printf( "%d\n", cuplaj );
    for( i = 1; i <= N; ++i )
        if( st[ i ] )
            printf( "%d %d\n", i, st[ i ] );

    return 0;
}