Cod sursa(job #611330)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 31 august 2011 23:58:27
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
#include <cstring>

#define NMAX 20001
#define pb push_back

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

vector< int > G[NMAX];
int N1, N2, M, x, y, i, CuplajMax = 0, St[NMAX], Dr[NMAX];
bool USED[NMAX];

inline bool Cupleaza( int NOD )
{
    if( USED[NOD] ) return false;
    USED[NOD] = 1;

    for( vector< int >::iterator Vecin = G[NOD].begin(); Vecin != G[NOD].end(); Vecin++ )
        if( !Dr[*Vecin] || Cupleaza( Dr[*Vecin] ) )
        {
            St[NOD] = *Vecin;
            Dr[*Vecin] = NOD;

            return true;
        }

    return false;
}

int main()
{
    in >> N1 >> N2 >> M;
    for( ; M--; )
    {
        in >> x >> y;
        G[x].pb( N1 + y );
        G[N1 + y].pb( x );
    }

    memset( USED, false, sizeof(USED) );
    memset( St, 0, sizeof(St) );
    memset( Dr, 0, sizeof(Dr) );

    for( i = 1; i <= N1; i++ )
        if( !St[i] )
        {
            if( Cupleaza( i ) ) ++CuplajMax;
            else
            {
                memset( USED, false, sizeof(USED) );
                if( Cupleaza( i ) ) ++CuplajMax;
            }
        }

    out << CuplajMax << '\n';
    for( i = 1; i <= N1; i++ )
        if( St[i] ) out << i << ' ' << St[i] - N1 << '\n';

    return 0;
}