Cod sursa(job #1476329)

Utilizator salam1Florin Salam salam1 Data 24 august 2015 22:45:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int NMAX = 10505;
int n, m, e, L[NMAX], R[NMAX];
vector<int> G[NMAX];
bool used[NMAX];

void read() {
  scanf("%d%d%d", &n, &m, &e);
  int x, y;
  for (int i = 1; i <= e; i++) {
    scanf("%d%d", &x, &y);
    G[x].push_back(y);
  }
}

// heuristic
void prepare() {
  for (int node = 1; node <= n; node++) {
    for (auto to: G[node]) {
      if (!R[to]) {
        L[node] = to;
        R[to] = node;
        break ;
      }
    }
  }
}

bool tryKuhn(int node) {
  if (used[node]) {
    return false;
  }
  used[node] = true;
  for (auto it = G[node].begin(); it != G[node].end(); it++) {
    if (!R[*it] || tryKuhn(R[*it])) {
      L[node] = *it;
      R[*it] = node;
      return true;
    }
  }
  return false;
}

void solve() {
  for (bool change = true ; change; ) {
    change = false;
    memset(used, false, sizeof(used));
    for (int i = 1; i <= n; i++)
      if (!L[i] && tryKuhn(i)) {
        change = true;
      }
  }

  int cnt = 0;
  for (int i = 1; i <= n; i++)
    if (L[i]) cnt++;

  printf("%d\n", cnt);
  for (int i = 1; i <= n; i++)
    if (L[i])
      printf("%d %d\n", i, L[i]);
}

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

  read();
  prepare();
  solve();
  return 0;
}