Cod sursa(job #241176)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 9 ianuarie 2009 15:51:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <string>
#define N 10001

struct nod
{
      int x;
      nod *n;
}*a[N];

int n,m,E;
int l[N], r[N];
bool use[N];

void add(int i, int j)
{
     nod *p=new nod;
     p->x=j;
     p->n=a[i];
     a[i]=p;
}

void citire()
{
     scanf("%d %d %d\n",&n,&m,&E);

     int p, q;
     while(E--)
     {
         scanf("%d %d\n",&p,&q);
         add(p,q);
     }
}

bool rez(int n)
{
     if(use[n])
        return 0;
     use[n]=1;
     nod *i;
     for(i=a[n]; i; i=i->n)
         if(!l[i->x])
         {
             l[i->x]=n;
             r[n]=i->x;
             return 1;
         }

     for(i=a[n];i;i=i->n)
         if(rez(l[i->x]))
         {
             l[i->x]=n;
             r[n]=i->x;
             return 1;
         }

     return 0;
}

void solve()
{

     int num=0,ok=1;
     while(ok)
     {
         ok=0;
         memset(use,0,sizeof(use));
         for(int i=1;i<=n;++i)
             if(!r[i])
                 if(rez(i))
                 {
                    num++;
                    ok=1;
                 }
     }

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


}
int main()
{
     freopen("cuplaj.in","r",stdin);
     freopen("cuplaj.out","w",stdout);
     citire();
     solve();
     return 0;
}