Cod sursa(job #1067712)

Utilizator andreiiiiPopa Andrei andreiiii Data 27 decembrie 2013 13:35:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <bitset>

using namespace std;

const int N=10006;

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

struct ls
{
    int n;
    ls *next;
};

ls *g[N];
int L[N], R[N];
bitset <N> v;
int n, m;

int pairup(int x)
{
    if(v[x]) return 0;
    ls *p;
    v[x]=1;
    for(p=g[x];p;p=p->next)
    {
        if(!R[p->n])
        {
            L[x]=p->n;
            R[p->n]=x;
            return 1;
        }
    }
    for(p=g[x];p;p=p->next)
    {
        if(pairup(R[p->n]))
        {
            L[x]=p->n;
            R[p->n]=x;
            return 1;
        }
    }
    return 0;
}

int main()
{
    int q, i, ok, x, y, sol=0;
    fin>>n>>m>>q;
    while(q--)
    {
        fin>>x>>y;
        ls *p=new ls;
        p->n=y;
        p->next=g[x];
        g[x]=p;
    }
    do
    {
        ok=0;
        v.reset();
        for(i=1;i<=n;i++) if(!L[i]) ok|=pairup(i);
    }
    while(ok);
    for(i=1;i<=n;i++) if(L[i]) sol++;
    fout<<sol<<"\n";
    for(i=1;i<=n;i++) if(L[i]) fout<<i<<" "<<L[i]<<"\n";
    fin.close();
    fout.close();
}