Cod sursa(job #2760040)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 22 iunie 2021 17:40:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

const int VMAX = 10000;

vector<int> L[1 + VMAX];
vector<int> R[1 + VMAX];

int cuplajL[1 + VMAX];
int cuplajR[1 + VMAX];

int sol;

bool vizL[1 + VMAX];

bool cuplaj(int nod)
{
  if (vizL[nod])
    return false;
  vizL[nod] = true;

  for (auto vecin : L[nod])
  {
    if (cuplajR[vecin] == 0)
    {
      cuplajL[nod] = vecin;
      cuplajR[vecin] = nod;
      sol++;

      return true;
    }
  }

  for (auto vecin : L[nod])
  {
    if (cuplaj(cuplajR[vecin]))
    {
      cuplajL[nod] = vecin;
      cuplajR[vecin] = nod;

      return true;
    }
  }

  return false;
}

int main()
{
  ifstream in("cuplaj.in");
  ofstream out("cuplaj.out");

  int n, m, e;
  in >> n >> m >> e;

  for (int i = 1; i <= e; i++)
  {
    int a, b;
    in >> a >> b;

    L[a].push_back(b);
    R[b].push_back(a);
  }

  // Hopcroft-Karp
  bool ok = true;

  while (ok)
  {
    ok = false;
    memset(vizL, 0, sizeof(vizL));

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

  out << sol << '\n';
  for (int i = 1; i <= n; ++i)
    if (cuplajL[i] != 0)
      out << i << ' ' << cuplajL[i] << '\n';

  return 0;
}