Cod sursa(job #2519261)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 7 ianuarie 2020 14:42:05
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <queue>
#include <stdio.h>
#include <vector>

const int DIM = 10000;

std::vector<int> G[5 + DIM];
int l[5 + DIM], r[5 + DIM];
bool visited[5 + DIM];

bool cupleaza(int u) {
  if (visited[u])
    return false;
  visited[u] = true;
  for (int v : G[u])
    if (r[v] == 0) {
      l[u] = v;
      r[v] = u;
      return true;
    }
  for (int v : G[u])
    if (cupleaza(v)) {
      l[u] = v;
      r[v] = u;
      return true;
    }
  return false;
}

int main() {

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

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

  bool ok = true;
  while (ok) {
    ok = false;
    for (int i = 0; i <= DIM; i++)
      visited[i] = false;
    for (int i = 1; i <= n; i++)
      if (l[i] == 0)
        ok |= cupleaza(i);
  }
  int cuplaj = 0;
  for (int i = 1; i <= n; i++)
    cuplaj += (l[i] > 0);
  printf("%d\n", cuplaj);
  for (int i = 1; i <= n; i++)
    if (l[i] > 0)
      printf("%d %d\n", i, l[i]);

  return 0;
}