Cod sursa(job #2238192)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 4 septembrie 2018 20:20:03
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>
#include <string.h>

using namespace std;

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

const int MAXV = 2e4;
const int MAXN = 1e4;
const int MAXM = 1e4;

vector<int> g[MAXV + 1];
bool viz[MAXV + 1];
int cup_le[MAXM + 1], cup_ri[MAXN + 1];

int n, m, e;

bool cuplaj(int node) {
  if(viz[node]) return false;
  viz[node] = true;

  for (auto x : g[node]) {
    if(cup_le[x] == 0) {
      cup_le[x] = node;
      cup_ri[node] = x;
      return true;
    }
  }

  for (auto x : g[node]) {
    if (cuplaj(cup_le[x])) {
      cup_le[x] = node;
      cup_ri[node] = x;
      return true;
    }
  }

  return false;
}

int main() {
  in >> n >> m >> e;

  for (int i = 1; i <= n + m; ++ i) {
    int a, b;
    in >> a >> b;
    g[a].push_back(b);
  }

  bool ok = true;
  while (ok == true) {
    ok = false;
    memset(viz, 0, sizeof viz);

    for (int i = 1; i <= n; ++ i) {
      if (cup_ri[i] == 0)
        ok |= cuplaj(i);
    }
  }

  int cnt = 0;
  for (int i = 1; i <= n; ++ i) {
    if (cup_ri[i] != 0)
      ++ cnt;
  }

  out << cnt << '\n';
  for (int i = 1; i <= n; ++ i) {
    if (cup_ri[i] != 0) {
      out << i << ' ' << cup_ri[i] << '\n';
    }
  }

  return 0;
}