Cod sursa(job #2345976)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 16 februarie 2019 21:56:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
// By Stefan Radu

#include <fstream>
#include <vector>

using namespace std;

#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;

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

bool Cuplaj (int curNode, vector < vector < int > > &gr, vector < bool > &used,
    vector < int > &left, vector < int > &right) {

  used[curNode] = true;

  for (auto x : gr[curNode]) {
    if (not right[x]) {
      left[curNode] = x;
      right[x] = curNode;
      return true;
    }
  }

  for (auto x : gr[curNode]) {
    if (not used[right[x]] and Cuplaj(right[x], gr, used, left, right)) {
      left[curNode] = x;
      right[x] = curNode;
      return true;
    }
  }

  return false;
}

int main() {

  int n, m, e;
  cin >> n >> m >> e;

  vector < vector < int > > gr(n + 1);

  for (int i = 1; i <= e; ++ i) {
    int a, b;
    cin >> a >> b;
    gr[a].push_back(b);
  }

  vector < bool > used(n + 1);
  vector < int > left(n + 1), right(m + 1);

  bool exists = 1;
  while (exists) {
    exists = false;
    fill(used.begin(), used.end(), false);
    for (int i = 1; i <= n; ++ i) {
      if (not left[i]) {
        exists |= Cuplaj(i, gr, used, left, right);
      }
    }
  }

  int cuplajSize = 0;
  for (int i = 1; i <= n; ++ i) {
    if (left[i]) ++ cuplajSize;
  }
  cout << cuplajSize << '\n';

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