Cod sursa(job #3218690)

Utilizator ililogIlinca ililog Data 27 martie 2024 19:44:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");


#define NMAX 10005

int n, m, e, uz[2 * NMAX], st[2 * NMAX], dr[2 * NMAX];
vector<int> v[2 * NMAX];

bool cup(int nod) {
  uz[nod] = 1;
  //cout << "uz[nod] = " << uz[nod] << endl;
  for (auto it : v[nod]) {
    if (!st[it]) {
      st[it] = nod;
      dr[nod] = it;
      //cout << "1 st[it] = " << st[it] << "  " << "dr[nod] = " << dr[nod] << endl;
      return 1;
    }
  }

  for (auto it : v[nod]) {
    if (!uz[st[it]] && cup(st[it])) {
      st[it] = nod;
      dr[nod] = it;
      //cout << "2 st[it] = " << st[it] << "  " << "dr[nod] = " << dr[nod] << endl;
      return 1;
    }
  }
  return 0;
}

int main(){
  fin >> n >> m >> e;
  for (int i=1;i<=e;i++) {
    int a, b;
    fin >> a >> b;
    b += NMAX;
    v[a].push_back(b);
    v[b].push_back(a);
  }

  int ok = 1;
  while (ok) {
    ok = 0;
    memset(uz, 0, sizeof(uz));
    for (int i=1;i<=n;i++) {
        //cout << i << "\n";
      //  cout << "uz[i] = " << uz[i] << "  " << "dr[i] = " << dr[i] << endl;
      if (!uz[i] && !dr[i]) {
         //   cout << "apelez " << i << endl;
        ok |= cup(i);
      }
    }
  }

  int ans = 0;
  for (int i=1;i<=n;i++) {
    if (dr[i]) ans++;
  }

  fout << ans << '\n';
  for (int i=1;i<=n;i++) {
    if (dr[i]) fout << i << ' ' << dr[i] - NMAX << '\n';
  }


  return 0;
}