Cod sursa(job #962240)

Utilizator timicsIoana Tamas timics Data 14 iunie 2013 09:33:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>
#include<vector>
using namespace std;
int L,R,E,x,y,v[22000],l[11000],r[11000];
vector<int> a[22000];

int pairup(int x)
{
    if(v[x])
        return 0;

    v[x]=1;
    int y=a[x].size();
    for(int i=0;i<y;++i)
        if(r[a[x][i]]==0)
        {
            l[x]=a[x][i];
            r[a[x][i]]=x;
            return 1;
        }

    for(int i=0;i<y;++i)
        if(pairup(r[a[x][i]])==1)
        {
            l[x]=a[x][i];
            r[a[x][i]]=x;
            return 1;
        }
    return 0;
}


int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&L,&R,&E);
    for(int i=1;i<=E;++i)
    {
        scanf("%d%d",&x,&y);
        a[x].push_back(y);
    }

    int ok=1;

    while(ok)
    {
        ok=0;
        for(int i=1;i<=L;++i)
            v[i]=0;

        for(int i=1;i<=L;++i)
        {
            if(l[i]==0)
                if(pairup(i)==1)
                    ok=1;
        }
    }

    int nr=0;
    for(int i=1;i<=L;++i)
        if(l[i])
            ++nr;

    printf("%d\n",nr);

    for(int i=1;i<=L;++i)
        if(l[i])
            printf("%d %d\n",i,l[i]);

    return 0;
}