Cod sursa(job #781341)

Utilizator visanrVisan Radu visanr Data 24 august 2012 11:16:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;


#define nmax 10010

int L[nmax], R[nmax], N, M, E, X, Y, used[nmax];
vector<int> G[nmax];


int PairUp(int node)
{
    if(used[node]) return 0;
    used[node] = 1;
    vector<int> :: iterator it;
    for(it = G[node].begin(); it != G[node].end(); ++it)
    {
           if(R[*it] == 0 || PairUp(R[*it]))
           {
                     L[node] = *it;
                     R[*it] = node;
                     return 1;
           }
    }
    return 0;
}

int Cuplaj()
{
     int ok = 1, cnt = 0, i;
     while(ok)
     {
              ok = 0;
              memset(used, 0, sizeof(used));
              for(i = 1; i <= N; i++)
                    if(!L[i] && PairUp(i))
                             cnt ++, ok = 1;
     }
     return cnt;
}

int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    int i;
    scanf("%i %i %i", &N, &M, &E);
    for(; E; E --)
    {
          scanf("%i %i", &X, &Y);
          G[X].push_back(Y);
    }
    printf("%i\n", Cuplaj());
    for(i = 1; i <= N; i++)
          if(L[i])
                  printf("%i %i\n", i, L[i]);
    return 0;
}