Cod sursa(job #2409646)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 19 aprilie 2019 12:30:07
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
using namespace std;

const int DIM = 10005;

int lef[DIM], rig[DIM];
vector<int> edg[DIM]; bitset<DIM> mrk;

int nr = 0;
bool match(int x)
{
  if (mrk[x]) {
    return false; }
  mrk[x] = true;
  for (int y : edg[x]) {
    if (!rig[y]) {
      lef[x] = y; rig[y] = x; ++nr;
      return true; } }
  for (int y : edg[x]) {
    if (match(rig[y])) {
      lef[x] = y; rig[y] = x;
      return true; } }
  return false;
}

int main(void)
{
  freopen("cuplaj.in", "r", stdin);
  freopen("cuplaj.out", "w", stdout);
  int n, m, v; cin >> n >> m >> v;
  for (int i = 1; i <= v; ++i) {
    int x, y; cin >> x >> y;
    edg[x].push_back(y); }
  bool ok; do {
    mrk.reset(); ok = false;
    for (int i = 1; i <= n; ++i) {
      if (!lef[i] && match(i)) {
        ok = true; } }
  } while (ok);
  cout << nr << "\n";
  for (int i = 1; i <= n; ++i) {
    if (lef[i]) {
      cout << i << " " << lef[i] << "\n"; } }
  return 0;
}