Cod sursa(job #553416)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 13 martie 2011 23:55:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <algorithm>
#include <bitset>
#include <fstream>
#include <vector>

using namespace std;

const char Input[] = "cuplaj.in";
const char Output[] = "cuplaj.out";

ifstream fin( Input );
ofstream fout( Output );

const short int Dim = 10001;

char s[Dim];
short int N, M, L, XXX;
short int l[Dim], r[Dim];
int E;
bitset <Dim> f;
vector <short int> v[Dim];

inline bool PairUp( const short int &nod ) {

    vector <short int> :: iterator it;

    if( f[nod] == true )
        return 0;

    f[nod] = true;

    for( it = v[nod].begin(); it != v[nod].end(); ++it )
        if( !r[*it] ) {

            l[nod] = *it;
            r[*it] = nod;

            return 1;
        }
    for( it = v[nod].begin(); it != v[nod].end(); ++it )
        if( PairUp( r[*it] ) ) {

            l[nod] = *it;
            r[*it] = nod;

            return 1;
        }

    return 0;
}

inline void ReadShort( short int &x ) {

    while( !isdigit( s[L] ) )
        if( ++L == Dim ) {

            fin.read( s, Dim );
            L = 0;
        }
    for( x = 0; isdigit( s[L] ); ) {

        x = x * 10 + s[L] - '0';
        if( ++L == Dim ) {

            fin.read( s, Dim );
            L = 0;
        }
    }
}

inline void ReadInt( int &x ) {

    while( !isdigit( s[L] ) )
        if( ++L == Dim ) {

            fin.read( s, Dim );
            L = 0;
        }
    for( x = 0; isdigit( s[L] ); ) {

        x = x * 10 + s[L] - '0';
        if( ++L == Dim ) {

            fin.read( s, Dim );
            L = 0;
        }
    }
}

int main() {

    bool ok;
    short int i, x, y;

    ReadShort( N ); //fin >> N;
    ReadShort( M ); //fin >> M;
    ReadInt( E ); //fin >> E;
    while( E-- ) {

        ReadShort( x ); //fin >> x;
        ReadShort( y ); //fin >> y;
        v[x].push_back( y );
    }

    do {

        ok = false;
        f.reset();

        for( i = 1; i <= N; ++i )
            if( !l[i] && PairUp( i ) ) {

                ++XXX;
                ok = true;
            }
    }
    while( ok == true );

    fout << XXX << "\n";
    for( i = 1; i <= N; ++i )
        if( l[i] )
            fout << i << " " << l[i] << "\n";

    fin.close();
    fout.close();

    return 0;
}