Cod sursa(job #2017609)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 1 septembrie 2017 21:14:51
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

const int MAX_N = 10000;
const int MAX_M = 10000;

std::vector<int>E[1 + MAX_N];
int l[1 + MAX_N];
int r[1 + MAX_N];
bool viz[1 + MAX_N];
int n, m, e;

bool match(int nod) {
  if (viz[nod])
    return false;
  viz[nod] = 1;
  for (auto it:E[nod]) {
    if (l[it] == 0) {
      r[nod] = it;
      l[it] = nod;
      return true;
    }
  }
  for (auto it:E[nod]) {
    if (!viz[l[it]] && match(l[it])) {
      r[nod] = it;
      l[it] = nod;
      return true;
    }
  }
  return false;
}

void cuplaj() {
  bool ok;
  do {
    ok = false;
    memset(viz, 0, sizeof(viz));
    for (int i = 1; i <= n; ++i) {
      if (r[i] == 0 && match(i))
        ok = true;
    }
  } while (ok);
}

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

  scanf("%d%d%d", &n, &m, &e);
  for (int i = 1; i <= e; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    E[u].push_back(v);
  }

  cuplaj();

  int k = 0;
  for (int i = 1; i <= n; ++i)
    if (r[i])
      k++;
  printf("%d\n", k);
  for (int i = 1; i <= n; ++i)
    if (r[i])
      printf("%d %d\n", i, r[i]);

  return 0;
}