Cod sursa(job #2670966)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 11 noiembrie 2020 07:20:50
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

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

int e, p, q, n;

bool visited[max_n];

int l[max_n], r[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 (!l[v]) {
      l[v] = u;
      r[u] = v;
      return true;
    }
  }
  for (int v : g[u]) {
    if (match(r[v]) == true) {
      l[v] = u;
      r[u] = v;
      return true;
    }
  }
  return false;
}

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