Cod sursa(job #241602)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 10 ianuarie 2009 14:48:57
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <memory>

struct nod
{
    int inf;
    nod *urm;
};

typedef nod *lista;
lista g[10001],p;

int k,m,n,x,y;
int fol[10001], lst[10002], sir[10002];

void baga(int x, int y)
{
     p=new nod;
     p->inf=y;
     p->urm=g[x];
     g[x]=p;
}

int check(int n)
{
     if(fol[n])
        return 0;
     fol[n]=1;
     lista k=new nod;
     for(k=g[n];k;k=k->urm)
         if(!lst[k->inf])
         {
             lst[k->inf]=n;
             sir[n]=k->inf;
             return 1;
         }
     for(k=g[n];k;k=k->urm)
         if(check(lst[k->inf]))
         {
             lst[k->inf]=n;
             sir[n]=k->inf;
             return 1;
         }
     return 0;
}

void exec()
{
     int nr=0;
     bool da=1;
     while(da)
     {
         da=0;
         memset(fol,0,sizeof(fol));
         for(int i=1;i<=n;++i)
             if(!sir[i])
                 if(check(i))
                 {
                    nr++;
                    da=1;
                 }
     }
     printf("%d\n",nr-1);
     for(int i=1;i<=n;++i)
         if(sir[i])
          printf("%d %d\n",i,sir[i]);
}

int main()
{
     freopen("cuplaj.in","r",stdin);
     freopen("cuplaj.out","w",stdout);
     scanf("%d %d %d\n",&n,&m,&k);
     for(int i=0;i<k;i++)
     {
         scanf("%d %d\n",&x,&y);
         baga(x,y);
     }
     exec();
     fclose(stdout);
     return 0;
}