Pagini recente » Cod sursa (job #2976492) | Cod sursa (job #2240755) | Cod sursa (job #31102) | Cod sursa (job #2770637) | Cod sursa (job #1639040)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
vector<vector<int>> al;
vector<int> mt;
vector<bool> vis;
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);
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);
}
int nm = 0;
bool chg;
vector<int> p(n0);
do {
chg = false;
vis.assign(n0, false);
for (int s = 0; s < n0; s++) if (mt[s] == -1) {
queue<int> q;
q.push(s);
vis[s] = true;
// printf("s: %d\n", s);
int ut, t = -1;
do {
int u = q.front();
q.pop();
for (int v: al[u]) {
if (mt[v] == -1) {
ut = u;
t = v;
break;
} else if (!vis[mt[v]]) {
q.push(mt[v]);
vis[mt[v]] = true;
p[mt[v]] = u;
}
}
if (t != -1) {
int u = ut;
int v = t;
while (true) {
mt[v] = u;
int v1 = mt[u];
mt[u] = v;
if (u == s) break;
u = p[u];
v = v1;
}
nm++;
chg = true;
break;
}
} while (!q.empty());
}
} 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;
}