Cod sursa(job #3216226)

Utilizator dorufDoru Floare doruf Data 15 martie 2024 18:37:22
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
#define eb emplace_back
using ll = long long;
using ld = long double;

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

const int N = 1e4 + 5;
int l[N], r[N], n, m, e;
vi g[N];
bitset<N> vis;


bool cuplaj(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(cuplaj(r[v])){
    r[v]=u;
    l[u]=v;
    return 1;
  }
  return 0;
}

int main() {
  ios_base::sync_with_stdio(false);
  fin.tie(0);
  fout.tie(0);

  fin >> n >> m >> e;
  for (int u, v, w; e; --e) {
    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 |= cuplaj(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';
}