Cod sursa(job #863042)

Utilizator Coman95coman cosmin Coman95 Data 23 ianuarie 2013 10:45:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
using namespace std;

#define MAXN 10005

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

int n, m, edges;
vector<int> G[MAXN];
vector<bool> s;
int L[MAXN], R[MAXN];

void Read();
int Solve();
int cupleaza( int x );
void Write();

int main()
{
    Read();
    Write();
    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    int x, y;
    fin >> n >> m >> edges;
    s.resize(n + 1);
    for( ; edges-- ;)
    {
        fin >> x >> y;
        G[x].push_back( y );
    }
    fin.close();

}
int Solve()
{
    bool ok = true;
    int result = 0;
    while( ok )
    {
        s.assign( n + 1, 0 );
        ok = false;
        for( int i = 1; i <= n; ++i )
            if( L[i] == 0 )
                if( cupleaza( i ) )
                    result++, ok = 1;
    }
    return result;
}
int cupleaza( int x )
{
    if( s[x] )
        return 0;
    s[x] = true;
    for( int i = 0; i < G[x].size(); ++i )
        if( R[G[x][i]] == 0 || cupleaza( R[G[x][i]] ) )
        {
            L[x] = G[x][i];
            R[G[x][i]] = x;
            return 1;
        }
    return 0;
}
void Write()
{
    fout << Solve() << '\n';
    for( int i = 1; i <= n; ++i )
        if( L[i] )
            fout << i << ' ' << L[i] << '\n';
}