Cod sursa(job #580866)

Utilizator drywaterLazar Vlad drywater Data 13 aprilie 2011 16:32:51
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
int n,m,i,l[10001],r[10001],u[10001],e,j,ok,cuplaj,t;
struct nod{int a; nod *next;};
nod *G[10001];
int add(int a,int b)
{
    nod *nou=new nod;
    nou->a=b;
    nou->next=G[a];
    G[a]=nou;
    return 0;
}
int pair(int x)
{
    if (u[x]) return 0;
    u[x]=1;
    nod *it=new nod;
    it=G[x];
    while (it)
    {
        if (!r[it->a])
        {
            l[x]=it->a;
            r[it->a]=x;
            return 1;
        }
        it=it->next;
    }
    it=G[x];
    while (it)
    {
        if (pair(r[it->a]))
        {
            l[x]=it->a;
            r[it->a]=x;
            return 1;
        }
        it=it->next;
    }
    return 0;
}
int main(void)
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&e);
    for (i=1;i<=e;i++)
    {
        scanf("%d%d",&t,&j);
        add(t,j);
    }
    ok=1;
    while (ok)
    {
        ok=0;
        for (i=1;i<=n;i++) u[i]=0;
        for (i=1;i<=n;i++)
        {
            if (!l[i])
                ok|=pair(i);
        }
    }
    for (i=1;i<=n;i++)
        if (l[i]>0) cuplaj++;
    printf("%d\n",cuplaj);
    for (i=1;i<=n;i++)
        if (l[i]>0) printf("%d %d\n",i,l[i]);
    return 0;
}