Cod sursa(job #2695523)

Utilizator Vasilescu-LaurentiuVasilescu Laurentiu-Marian Vasilescu-Laurentiu Data 13 ianuarie 2021 15:55:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

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

int e, p, q;

bool vizitat[max_n];

int l[max_n], r[max_n];

vector<int> g[max_n];

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

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