Cod sursa(job #2698430)

Utilizator Iulia25Hosu Iulia Iulia25 Data 22 ianuarie 2021 09:31:57
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <cstring>
#include <unordered_map>
#include <queue>
#include <vector>

using namespace std;

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

unordered_map <int, int> c[20005];

int n, m, e, N, nr;
int ans[20005], anterior[20005];

vector <int> v[20005];
queue <int> q;

void bfs();

void reconstituire()  {
  int nod = N;
//  cout << "idk";
  while (nod != 0)  {
    --c[anterior[nod]][nod];
    ++c[nod][anterior[nod]];
    if (!ans[anterior[nod]] && nod > n && nod < N)
      ++nr;
    ans[anterior[nod]] = nod;
    nod = anterior[nod];
  }
}

void reinit()  {
  memset(anterior, 0, sizeof(anterior));
  while (!q.empty())
    q.pop();
}

void bfs()  {
  bool ok = true;
  while (ok)  {
    reinit();
    q.push(0);
    ok = false;
    while (!q.empty() && !ok)  {
      int nod = q.front();
      q.pop();
      for (auto it : v[nod])  {
        if (!c[nod][it] || anterior[it])  {
          continue;
        }
        anterior[it] = nod;
  //      cout << it << '\n';
        if (it == N)  {
          reconstituire();
          ok = true;
          break;
        }
        q.push(it);
      }
    }
  }
}

int main()  {
  cin >> n >> m >> e;
  N = n + m + 1;
  for (int i = 1; i <= n; ++i)  {
    v[0].push_back(i);
    c[0][i] = 1;
    v[i].push_back(0);
  }
  int x, y;
  for (int i = 1; i <= e; ++i)  {
    cin >> x >> y;
    v[x].push_back(y + n);
    v[y + n].push_back(x);
    c[x][y + n] = 1;
  }
  for (int i = 1; i <= m; ++i)  {
    v[i + n].push_back(N);
    c[i + n][N] = 1;
    v[N].push_back(i + n);
  }
  bfs();
  cout << nr << '\n';
  for (int i = 1; i <= n; ++i)  {
    if (ans[i])  {
      cout << i << ' ' << ans[i] - n << '\n';
    }
  }
  return 0;
}