Cod sursa(job #2093091)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 22 decembrie 2017 21:55:16
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <vector>

const int MAXN = 1e5;

std::vector <int> g[MAXN + 1];
int st[MAXN + 1], dr[MAXN + 1];
bool vis[MAXN + 1];

bool pairup(int u) {
  if (vis[u]) {
    return 0;
  }
  vis[u] = 1;
  for (auto v: g[u]) {
    if (!dr[v]) {
      st[u] = v;
      dr[v] = u;
      vis[u] = 0;
      return 1;
    }
  }
  for (auto v: g[u]) {
    if (!vis[dr[v]] && pairup(dr[v])) {
      st[u] = v;
      dr[v] = u;
      vis[u] = 0;
      return 1;
    }
  }
  return 0;
}

int main() {
  int n, m, e, u, v, cpl;
  bool flag;
  FILE *f = fopen("cuplaj.in", "r");
  fscanf(f, "%d%d%d", &n, &m, &e);
  for (int i = 0; i < e; ++i) {
    fscanf(f, "%d%d", &u, &v);
    g[u].push_back(v);
  }
  fclose(f);
  cpl = 0;
  do {
    flag = 0;
    for (int i = 1; i <= n; ++i) {
      if (!st[i] && pairup(i)) {
        ++cpl;
        flag = 1;
      }
    }
  } while (flag);
  f = fopen("cuplaj.out", "w");
  fprintf(f, "%d\n", cpl);
  for (int i = 1; i <= n; ++i) {
    if (st[i]) {
      fprintf(f, "%d %d\n", i, st[i]);
    }
  }
  fclose(f);
  return 0;
}