Cod sursa(job #303550)

Utilizator ZillaMathe Bogdan Zilla Data 9 aprilie 2009 23:09:48
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>

#define Nmax 10005

struct nod{
    int info;
    nod *next;
};

nod *p[Nmax];
int l[Nmax],r[Nmax],v[Nmax],n,m;

int cupleaza(int i)
{
    if(v[i])
        return 0;
    v[i]=1;
    for(nod *current=p[i];current;current=current->next)
        if(r[current->info]==0)
            {
                r[current->info]= i;
                l[i]=current->info;
                return 1;
            }
    for(nod *current=p[i];current;current=current->next)
        if(cupleaza(r[current->info]))
            {
                r[current->info]=i;
                l[i]=current->info;
                return 1;
            }
    return 0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    
    int x,y,t,i;
    
    scanf("%d%d%d",&n,&m,&t);
    
    while(t--)
        {
            scanf("%d%d",&x,&y);
            nod *current=new nod;
            current->info=y;
            current->next=p[x];
            p[x]=current;
        }
    
    int ok;
    for(ok=1;ok;)
        {
            ok=0;
            for(i=1;i<=n;++i)
                v[i]=0;
            for(i=1;i<=n;++i)
                if(l[i]==0)
                    ok |= cupleaza(i);
        }
    t=0;
    for(i=1;i<=n;++i)
        if(l[i])
            ++t;
    printf("%d\n",t);
    for(i=1;i<=n;++i)
        if(l[i])
            printf("%d %d\n",i,l[i]);
            
    return 0;    
}