Cod sursa(job #2756203)

Utilizator EZ4ENCEAleksi Jalli EZ4ENCE Data 30 mai 2021 11:59:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
#define NMAX 10000

using namespace std;

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

vector <int> G[NMAX + 1];
int n, m;
bool is_vis[NMAX + 1];
int l[NMAX + 1], r[NMAX + 1];

bool pair_up(int poz) {
  int i, nvec, vec;

  if (is_vis[poz] == 1)
    return 0;

  is_vis[poz] = 1;

  nvec = G[poz].size();
  for (i = 0; i < nvec; i++) {
    vec = G[poz][i];
    if (l[vec] == 0) {
      r[poz] = vec;
      l[vec] = poz;
      return 1;
    }
  }

  for (i = 0; i < nvec; i++) {
    vec = G[poz][i];
    if (!is_vis[l[vec]] && pair_up(l[vec])) {
      r[poz] = vec;
      l[vec] = poz;
      return 1;
    }
  }

  return 0;
}

void cuplaj() {
  int i, ok;

  do {
    ok = 0;

    for (i = 1; i <= n; i++)
      is_vis[i] = 0;

    for (i = 1; i <= n; i++)
      if (r[i] == 0 && pair_up(i))
        ok = 1;
  }while (ok == 1);
}

int main() {
  int e, i, x, y, sol;
  fin >> n >> m >> e;

  for (i = 0; i < e; i++) {
    fin >> x >> y;
    G[x].push_back(y);
  }

  cuplaj();

  sol = 0;
  for (i = 1; i <= n; i++)
    if (r[i] > 0)
      sol++;

  fout << sol << "\n";
  for (i = 1; i <= n; i++)
    if (r[i] > 0)
      fout << i << " " << r[i] << "\n";

  return 0;
}