Cod sursa(job #2643444)

Utilizator retrogradLucian Bicsi retrograd Data 19 august 2020 20:52:49
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

template<int N>
int FF(bitset<N> bs) {
  return bs._Find_first();
  // for (int i = 0; i < N; ++i)
  //   if (bs[i])
  //     return i;
  // return N;
}

template<int N>
struct Matcher {
  array<bitset<N>, N> graph;
  bitset<N> ml, mr;
  array<int, N> l, r;
  bitset<N> vis;

  Matcher() { 
    for (int i = 0; i < N; ++i)
      l[i] = r[i] = -1;
  }

  void AddEdge(int a, int b) {
    graph[a][b] = 1;
  }

  bool Match(int node) {
    if ((graph[node] & (~mr)).count()) {
      int vec = FF<N>(graph[node] & (~mr));
      ml[node] = true; mr[vec] = true;
      l[node] = vec; r[vec] = node;
      return true;
    } 
    while (true) {
      int vec = FF<N>(graph[node] & (~vis));
      if (vec >= N) break;
      vis[vec] = true;
      if (Match(r[vec])) {
        ml[node] = true;
        l[node] = vec; r[vec] = node;
        return true;
      }
    }
    return false;
  }

  int Solve(int k) {
    bool stop = false;
    int got = 0;
    while (!stop && got < k) {
      vis.reset();
      stop = true;
      for (int i = 0; i < N; ++i) {
        if (!ml[i] && Match(i)) {
          stop = false;
          ++got;
        }
      }
    }
    return got;
  }
};

int main() {
  ifstream cin("cuplaj.in");
  ofstream cout("cuplaj.out");
  int n, m, k; cin >> n >> m >> k;
  Matcher<10000> mc;
  for (int i = 0; i < k; ++i) {
    int a, b; cin >> a >> b; 
    mc.AddEdge(a - 1, b - 1);
  }
  cout << mc.Solve(n) << '\n';
  for (int i = 0; i < n; ++i) 
    if (mc.l[i] != -1) 
      cout << i + 1 << " " << mc.l[i] + 1 << '\n';
  return 0;
}