Cod sursa(job #303403)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 9 aprilie 2009 20:20:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
# include <cstdio>
# include <algorithm>

using namespace std;

# define FIN "cuplaj.in"
# define FOUT "cuplaj.out"
# define MAXN 10005

struct Nod
{
       int Vecin;
       Nod *next;
} *Graf[MAXN], *p;

int N, M, E, i, ct, ok;
int l[MAXN], r[MAXN], s[MAXN];

    int PairUp(int N)
    {
        Nod *p;
        
        if (s[N]) return 0;
        
        s[N] = 1;
        
        for (p = Graf[N]; p != NULL; p = p -> next)
           if (!l[p -> Vecin])
           {
              l[p -> Vecin] = N;
              r[N] = p -> Vecin;
              return 1;
           }
        
        for (p = Graf[N]; p != NULL; p = p -> next)
          if (PairUp(l[p -> Vecin]))
          {
              l[p -> Vecin] = N;
              r[N] = p -> Vecin;
              return 1;
          }
        
        return 0;
    }

    int main()
    {
        freopen(FIN, "r", stdin);
        freopen(FOUT, "w", stdout);
        
        scanf("%d%d%d", &N, &M, &E);
        
        int a, b;
        for (i = 1; i <= E; ++i)
        {
            scanf("%d%d", &a, &b);
            
            p = new Nod; p -> Vecin = b; p -> next = Graf[a]; Graf[a] = p;
        }
        
        ct = 0; ok = 1;
        while (ok)
        {
            ok = 0;
            memset(s, 0, sizeof(s));
            
            for (i = 1; i <= N; ++i)
              if (!r[i])
                if (PairUp(i))
                {
                   ++ct;
                   ok = 1;
                }
        }
        
        printf("%d\n", ct);
        for (i = 1; i <= N; ++i)
          if (r[i]) printf("%d %d\n", i, r[i]);
        
        return 0;
    }