Cod sursa(job #806831)

Utilizator danalex97Dan H Alexandru danalex97 Data 3 noiembrie 2012 16:35:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
// Algoritmul Hapcroft Karp optimizeaza ideea de cuplaj cu lanturi
// alternante , rafinand-o. El face toate cuplajele posibile fara a
// modifica tot ce am facut la pasul actual. Deci intai vom face un
// cuplaj cu tot ce se poate si apoi la fiecare pas il vom imbunatati.
// Viteza acestui algoritm este de O(sqrt(N)*L).

#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

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

const int Nmax = 10010;

vector<int> A[Nmax];
int Fixed[Nmax];
int L[Nmax],R[Nmax];
int N,M,T,Sol;

typedef vector<int>::iterator IT;

int Look( int Nod )
{
    if ( Fixed[Nod] == 1 ) return 0;
    Fixed[Nod] = 1;

    for (IT it=A[Nod].begin();it!=A[Nod].end();++it)
        if ( R[*it] == 0 )
        {
            L[ Nod ] = *it;
            R[ *it ] = Nod;
            return 1;
        }
    for (IT it=A[Nod].begin();it!=A[Nod].end();++it)
        if ( Look( R[*it] ) )
        {
            L[ Nod ] = *it;
            R[ *it ] = Nod;
            return 1;
        }

    return 0;
}

int main()
{
    F>>N>>M>>T;
    for (int i=1,x,y;i<=T;++i)
    {
        F>>x>>y;
        A[x].push_back(y);
    }

    for ( bool Ok=1; Ok ; )
    {
        Ok = 0;
        memset( Fixed, 0 , sizeof(Fixed) );
        for (int i=1;i<=N;++i)
            if ( L[i] == 0 )
                Ok |= Look( i );
    }
    for (int i=1;i<=N;++i) Sol+=L[i]!=0;
    G<<Sol<<'\n';
    for (int i=1;i<=N;++i)
        if ( L[i] )
            G<<i<<' '<<L[i]<<'\n';
}