Cod sursa(job #968131)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 1 iulie 2013 20:28:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
// Algoritmul Hopcroft-Karp
// Complexitate: O(sqrt(N)*M)

#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
const int NMAX = 10005;
int N,M,E,X,Y,OK,SOL,L[NMAX],R[NMAX],i;
vector<int> V[NMAX];
bitset<NMAX> Used;
void Read()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&N,&M,&E);
    for(;E;E--)
    {
        scanf("%d%d",&X,&Y);
        V[X].push_back(Y);
    }
}
int PairUp(int Node)
{
    if(Used[Node]) return 0;
    Used[Node]=1;
    for(vector<int>::iterator it=V[Node].begin();it!=V[Node].end();it++)
        if(!R[*it] || PairUp(R[*it]))
        {
            L[Node]=*it;
            R[*it]=Node;
            return 1;
        }
    return 0;
}
void Cuplaj()
{
    for(OK=1;OK;)
    {
        Used=0; OK=0;
        for(i=1;i<=N;i++)
            if(!L[i] && PairUp(i)) OK=1,SOL++;
    }
}
void Print()
{
    printf("%d\n",SOL);
    for(i=1;i<=N;i++) if(L[i]) printf("%d %d\n",i,L[i]);
}
int main()
{
    Read();
    Cuplaj();
    Print();
    return 0;
}