Cod sursa(job #1058252)

Utilizator overflowUNIBUC Cretescu Bunget.fara Tilica overflow Data 15 decembrie 2013 12:30:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>


using namespace std;

const int MAX_N = 10010;
vector <int> G[MAX_N];
int N, M, IN[MAX_N], OUT[MAX_N], l[MAX_N], r[MAX_N];
bool viz[MAX_N];

bool path( int nod ){

    vector<int>::iterator it;
    if( viz[nod] == 1 ) return 0;
    viz[nod] = 1;
    for( it = G[nod].begin(); it != G[nod].end(); ++it )
        if( r[(*it)] == 0 ){

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

            l[nod] = (*it);
            r[(*it)] = nod;
            return 1;
            }
    return 0;
}

void solve(){

    bool e = true;
    while( e ){

        e = false;
        memset( viz, 0, sizeof( viz ) );
        for( int i = 1; i <= N; ++i )
            if( l[i] == 0 && path( i ) ) e = true;
    }
}

int main()
{
    ifstream cin( "cuplaj.in" );
    ofstream cout( "cuplaj.out" );

    int E;
    cin >> N >> M >> E;
    for( int i = 1; i <= E; ++i ){

        int x, y;
        cin >> x >> y;
        G[x].push_back( y );
        }

    solve();
    int sol = 0;
    for( int i = 1; i <= N; ++i )
        if( l[i] ) ++sol;
    cout << sol << "\n";
    for( int i = 1; i <= N; ++i )
        if( l[i] ) cout << i << " " << l[i] << "\n";
    return 0;
}