Cod sursa(job #347490)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 12 septembrie 2009 15:18:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
/*
     Hopcroft - Karp
     Complexitate : O(E * sqrt(V))
*/
#include<stdio.h>

struct Nod {
     int V;
     Nod *Next;
};

int L[10005];
int R[10005];
int nL;
int Res;
int ok;
int xM;
int yM;
int CMax;
int use[10005];
int nR;
int M;
Nod *a[10005];

void insert(Nod *&K, int Val)
{
        Nod *nAux = new Nod;
        nAux -> V = Val;
        nAux -> Next = K;
        K = nAux;
}
int PrUp(int i)
{
        if (use[i])
         return 0;
        use[i] = 1;

        for(Nod *it = a[i]; it; it = it -> Next)
         if (!L[it -> V])
          {
              L[it -> V] = i;
              R[i] = it -> V;
              return 1;
          }

         for(Nod *it = a[i]; it; it = it -> Next)
          if (PrUp(L[it -> V]))
           {
              L[it -> V] = i;
              R[i] = it -> V;
              return 1;
           }

        return 0;
}


int main()
{
        freopen("cuplaj.in","r",stdin);
        freopen("cuplaj.out","w",stdout);

        scanf("%d %d %d",&nL, &nR, &M);

        for(int i = 1; i <= M; i++)
         {
                scanf("%d %d",&xM,&yM);
                insert(a[xM],yM);
         }

         do
         {
             ok = 0;
             for(int i = 1; i <= nL; i++)
              use[i] = 0;
             for(int i = 1; i <= nL; i++)
              if (!R[i])
               if (PrUp(i))
                ok = Res++;
         }
         while (ok);

         printf("%d\n", Res);
         for(int i = 1; i <= nL; i++)
          if (R[i])
          {
                printf("%d %d\n", i, R[i]);
          }
}