Cod sursa(job #2737734)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 5 aprilie 2021 01:38:09
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

const int max_n = (int)1e5 + 5;

int n, m, q;

int l[max_n], r[max_n];

bool visited[max_n];

vector<int> g[max_n];

bool match(int u) {
  if (visited[u] == true) {
    return false;
  }
  visited[u] = true;
  for (int v : g[u]) {
    if (!r[v]) {
      l[u] = v;
      r[v] = u;
      return true;
    }
  }
  for (int v : g[u]) {
    if (match(r[v]) == true) {
      l[u] = v;
      r[v] = u;
      return true;
    }
  }
  return false;
}

int main() {
  in >> n >> m >> q;
  for (int i = 1; i <= q; i++) {
    int u, v;
    in >> u >> v;
    g[u].push_back(v);
  }
  for (bool changed = true; changed; ) {
    changed = false;
    fill(visited + 1, visited + n + m + 1, false);
    for (int i = 1; i <= n; i++) {
      if (!l[i]) {
        changed |= match(i);
      }
    }
  }
  int covered = 0;
  for (int i = 1; i <= n; i++) {
    if (l[i] > 0) {
      covered++;
    }
  }
  out << covered << "\n";
  for (int i = 1; i <= n; i++) {
    if (l[i] > 0) {
      out << i << " " << l[i] << "\n";
    }
  }
  return 0;
}