Cod sursa(job #3041438)

Utilizator dorufDoru Floare doruf Data 31 martie 2023 15:15:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using VI = vector<int>;
using pii = pair<int,int>;
#define mp make_pair
#define eb emplace_back

const string TASK("cuplaj");

ifstream fin(TASK + ".in");
ofstream fout(TASK + ".out");

const int N = 1e5 + 5;
VI g[N]; int n, m, idk;
int l[N], r[N];
bitset<N> vis;

bool match(int u) {
  if (vis[u]) return 0;
  vis[u] = 1;
  for (auto v : g[u])
  if (!r[v]) {
    r[v] = u;
    l[u] = v;
    return 1;
  }
  for (auto v : g[u]) {
    if (match(r[v])) {
      r[v] = u;
    l[u] = v;
    return 1;
    }
  }
  return 0;
}

int main() {
  fin >> n >> idk >> m;
  for (int u, v, i = 1; i <= m; ++i) {
    fin >> u >> v;
    g[u].eb(v);
  }
  bool ok = 1;
  while (ok) {
    vis.reset();
    ok = 0;
    for (int i = 1; i <= n; ++i)
      if (!l[i]) ok|= match(i);
  }
  int ans = 0;
  for (int i = 1; i <= n; ++i)
    if (l[i]) ++ans;
  fout << ans << '\n';
  for (int i = 1; i <= n; ++i)
    if (l[i]) fout << i << ' ' << l[i] << '\n';
}