Pagini recente » Cod sursa (job #176196) | Cod sursa (job #705419) | Cod sursa (job #584944) | Cod sursa (job #1639845) | Cod sursa (job #1637528)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<vector<int>> al;
vector<int> mt;
vector<bool> vis;
bool dfs(int u) {
vis[u] = true;
for (int v: al[u]) {
if (mt[v] == -1) {
mt[v] = u;
mt[u] = v;
return true;
}
}
for (int v: al[u]) {
if (!vis[mt[v]] && dfs(mt[v])) {
mt[v] = u;
mt[u] = v;
return true;
}
}
return false;
}
int main() {
#ifdef INFOARENA
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
#endif
cin.sync_with_stdio(false);
int n0, n1, m;
cin >> n0 >> n1 >> m;
al.resize(n0+n1);
mt.assign(n0+n1, -1);
for (int u, v, i = 0; i < m; i++) {
cin >> u >> v;
u--;
v += n0-1;
al[u].push_back(v);
al[v].push_back(u);
}
int nm = 0;
// for (int u = 0; u < n0; u++) {
// for (int v: al[u]) {
// if (mt[v] == -1) {
// mt[v] = u;
// mt[u] = v;
// nm++;
// break;
// }
// }
// }
bool chg;
int n = n0;
int s = 0;
do {
chg = false;
vis.assign(n0+n1, false);
for (int u = s; u < s+n; u++) {
if (mt[u] == -1 && !vis[u] && dfs(u)) {
nm++;
chg = true;
}
}
n ^= n0^n1;
s ^= n0;
} while (chg);
printf("%d\n", nm);
for (int u = 0; u < n0; u++) {
if (mt[u] != -1)
printf("%d %d\n", u+1, mt[u]-n0+1);
}
return 0;
}