Cod sursa(job #2330900)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 28 ianuarie 2019 22:22:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e4;

vector <int> gr[MAXN + 1];
int gagic[MAXN + 1], pereche[MAXN + 1];

bool viz[MAXN + 1];


bool bkt_opt (int baiat) {
  if (viz[baiat] == true)
    return false;
  viz[baiat] = true;
  for (auto fata : gr[baiat])
    if (gagic[fata] == false || bkt_opt (gagic[fata]) == true) {
      pereche[baiat] = fata;
      gagic[fata] = baiat;
      return true;
    }
  return false;
}

int main() {
  int n, m, e, i, x, y, nr;
  freopen ("cuplaj.in", "r", stdin);
  freopen ("cuplaj.out", "w", stdout);

  scanf ("%d%d%d", &n, &m, &e);

  for (i = 1; i <= e; i++) {
    scanf ("%d%d", &x, &y);
    gr[x].push_back (y);
  }

  do {
    memset (viz, 0, sizeof (viz));
    nr = 0;
    for (i = 1; i <= n; i++)
      if (pereche[i] == 0)
        nr += bkt_opt (i);
  } while (nr);

  nr = 0;
  for (i = 1; i <= n; i++)
    if (pereche[i])
      nr++;

  printf ("%d\n", nr);
  for (i = 1; i <= n; i++)
    if (pereche[i])
      printf ("%d %d\n", i, pereche[i]);

  return 0;
}