Cod sursa(job #254052)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 6 februarie 2009 17:22:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
# include <cstdio>
# include <vector>

using namespace std;

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

int N, M, E, i;
vector <int> G[MAXN];
int s[MAXN], l[MAXN], r[MAXN];

    int Pairup(int N)
    {
        vector <int> :: iterator it;
        
        if (s[N]) return 0;
        
        s[N] = 1;
        for (it = G[N].begin(); it != G[N].end(); ++it)
          if (!r[*it])
            {
               l[N] = *it;
               r[*it] = N;
               return 1;
            }
        for (it = G[N].begin(); it != G[N].end(); ++it)
          if (Pairup(r[*it]))
            {
               l[N] = *it;
               r[*it] = N;
               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 (; E; --E)
        {
            scanf("%d %d",&a, &b);
            G[a].push_back(b);
        }
        
        int ok = 1, card = 0;
        for (; ok;)
        {
           ok = 0;
           memset(s, 0, sizeof(s));
           for (i = 1; i <= N; ++i)
             if (!l[i] && Pairup(i))
               ok = 1, ++card;
        }
        
        printf("%d\n", card);
        for (i = 1; i <= N; ++i)
          if (l[i]) printf("%d %d\n",i, l[i]);
        
        return 0;
    }