Cod sursa(job #2411981)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 21 aprilie 2019 15:08:28
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
// By Stefan Radu

#include <algorithm>
#include <fstream>
#include <iomanip>
#include <cassert>
#include <vector>
#include <string>
#include <cctype>
#include <queue>
#include <deque>
#include <cmath>
#include <stack>
#include <map>
#include <set>

using namespace std;

ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");

#define sz(x) (int)(x).size()

typedef pair < int, int > pii;
typedef long long ll;
typedef long double ld;
typedef unsigned int ui;
typedef unsigned long long ull;

vector < vector < int > > gr;
vector < int > le, ri;
vector < bool > used;

bool dfs(int curNode) {

  used[curNode] = true;

  for (int x : gr[curNode]) {
    if (ri[x]) continue;
    le[curNode] = x;
    ri[x] = curNode;
    return true;
  }

  for (int x : gr[curNode]) {
    if (not used[ri[x]] and dfs(ri[x])) {
      le[curNode] = x;
      ri[x] = curNode;
      return true;
    }
  }

  return false;
}

int main() {

#ifdef STEF
  freopen("input", "r", stdin);
  freopen("output", "w", stdout);
#endif

  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);

  int n, m, k;
  cin >> n >> m >> k;

  gr.resize(n + 1);
  for (int i = 1; i <= k; ++ i) {
    int a, b;
    cin >> a >> b;
    gr[a].emplace_back(b);
  }

  le.resize(n + 1);
  ri.resize(m + 1);
  used.resize(n + 1);

  bool more = true;
  while (more) {

    fill(used.begin(), used.end(), false);

    more = false;
    for (int i = 1; i <= n; ++ i) {
      if (not le[i]) more |= dfs(i);
    }
  }

  int cnt = 0;
  for (int i = 1; i <= n; ++ i) cnt += le[i] != 0;

  cout << cnt << '\n';
  for (int i = 1; i <= n; ++ i) if (le[i]) cout << i << ' ' << le[i] << '\n';
}