Cod sursa(job #300317)

Utilizator vladbBogolin Vlad vladb Data 7 aprilie 2009 12:56:12
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>

struct nod { int v;
             nod * next;
           } *v[10001]; 
int st[10001],dr[10001],u[10001],n,e,m;

int cuplaj(int nd)
{   if(u[nd]) return 0;
    u[nd]=1;
    nod *p;
    for(p=v[nd];p;p=p->next)
       if(!st[p->v]||cuplaj(st[p->v]))
        {  dr[nd]=p->v;
           st[p->v]=nd;
           return 1;
        }
    return 0;
}

int main()
{    freopen("cuplaj.in","r",stdin);
     freopen("cuplaj.out","w",stdout);
     int x,y,i,cont,r;
     scanf("%d%d%d",&n,&m,&e);
     for(i=1;i<=e;i++)
     {   scanf("%d%d",&x,&y);
         nod *p=new nod;
         p->v=y;
         p->next=v[x];
         v[x]=p;
     }
     cont=1;
     while(cont)
     {   cont=0;
         for(i=1;i<=n;i++)
            u[i]=0;
         for(i=1;i<=n;i++)
            if(!dr[i]) cont=cuplaj(i);
     }
     r=0;
     for(i=1;i<=n;i++)
        if(dr[i]) r++;
     printf("%d\n",r);
     for(i=1;i<=n;i++)
        if(dr[i]) printf("%d %d\n",i,dr[i]);
     fclose(stdin);
     fclose(stdout);
     return 0;
}