Cod sursa(job #553409)

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

using namespace std;

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

const int Dim = 10001;

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

bool PairUp( int nod ) {

    vector <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;
}

int main() {

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

    bool ok;
    int i, x, y;

    fin >> N >> M >> E;
    while( E-- ) {

        fin >> x >> 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;
}