Cod sursa(job #473457)

Utilizator MciprianMMciprianM MciprianM Data 29 iulie 2010 15:52:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>

using namespace std;

const int MAXN = 10009;

vector <int> G [ MAXN ];
int n, m, e, l [ MAXN ], r [ MAXN ];
bool u [ MAXN ];

int match ( const int nd ){

    if ( u [ nd ] ) return 0;
    else u [ nd ] = true;

    vector < int > :: iterator it;
    for ( it = G [ nd ] . begin (); it != G [ nd ] . end (); ++ it )
        if ( ! r [ * it ] ){
            l [ nd ] = * it;
            r [ * it ] = nd;
            u [ * it ] =true;
            return 1;
        }

    for ( it = G [ nd ] . begin (); it != G [ nd ] . end (); ++ it )
        if ( match ( r [ * it ] ) ){
            l [ nd ] = * it;
            r [ * it ] = nd;
            u [ * it ] =true;
            return 1;
        }

    return 0;

}

int main(){

    int i, x, y, cuplaj = 0;
    ifstream f ( "cuplaj.in" );
    ofstream g ( "cuplaj.out" );

    f >> n >> m >> e;
    while( e -- ){
        f >> x >> y;
        G [ x ] . push_back ( y );
    }
    for ( bool ok = true; ok; ){
        ok = false;
        memset ( u, 0, sizeof ( u ) );
        for ( i = 1; i <= n; ++ i )
            if ( ! l [ i ] )
                if ( match ( i ) )
                    cuplaj ++, ok = true;
    }

    g << cuplaj << '\n';

    for ( i = 1; i <= n; ++ i )
        if ( l [ i ] )
            g << i << ' ' << l [ i ] << '\n';

    g . close ();

    return 0;
}