Cod sursa(job #303039)

Utilizator crawlerPuni Andrei Paul crawler Data 9 aprilie 2009 14:52:45
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>

#define Nmax 10100

struct Nod
{
     int a;
     Nod *x;     
} *h[Nmax];

int l[Nmax], r[Nmax], v[Nmax],n,m; 

int cupleaza(int nod)
{
     if (v[nod] != 0)
          return 0;
     v[nod] = 1;
     for (Nod *it=h[nod];it;it=it->x)
          if (r[it->a] == 0)
          {
               r[it->a] = nod;
               l[nod] = it->a;
               return 1;     
          }   
     for (Nod *it=h[nod];it;it=it->x)
          if (cupleaza(r[it->a]))
          {
               r[it->a] = nod;
               l[nod] = it->a;
               return 1;                         
          }  
     return 0;
}

int main()
{
     freopen("cuplaj.in","r",stdin);
     freopen("cuplaj.out","w",stdout);
     
     int t,x,y;
     
     scanf("%d%d%d", &n,&m,&t);
     
     while (t--)
     {
          scanf("%d%d", &x,&y);
          Nod *q = new Nod;
          q->a = y;
          q->x = h[x];
          h[x] = q;     
     }
     
     for (int ok;ok;)
     {
          ok = 0;
          for (int i=1;i<=n;++i)
               v[i] = 0;
          for (int i=1;i<=n;++i)
          if (l[i] == 0)
               ok |= cupleaza(i);
     }

     t = 0;     
     for (int i=1;i<=n;++i)
          if (l[i] != 0)
               ++t;
               
     printf("%d\n", t);
     
     for (int i=1;i<=n;++i)
          if (l[i] != 0)
               printf("%d %d\n", i, l[i]);
               
     return 0;     
}