Pagini recente » Cod sursa (job #2369451) | Cod sursa (job #614294) | Cod sursa (job #2635508) | Cod sursa (job #429421) | Cod sursa (job #1476329)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int NMAX = 10505;
int n, m, e, L[NMAX], R[NMAX];
vector<int> G[NMAX];
bool used[NMAX];
void read() {
scanf("%d%d%d", &n, &m, &e);
int x, y;
for (int i = 1; i <= e; i++) {
scanf("%d%d", &x, &y);
G[x].push_back(y);
}
}
// heuristic
void prepare() {
for (int node = 1; node <= n; node++) {
for (auto to: G[node]) {
if (!R[to]) {
L[node] = to;
R[to] = node;
break ;
}
}
}
}
bool tryKuhn(int node) {
if (used[node]) {
return false;
}
used[node] = true;
for (auto it = G[node].begin(); it != G[node].end(); it++) {
if (!R[*it] || tryKuhn(R[*it])) {
L[node] = *it;
R[*it] = node;
return true;
}
}
return false;
}
void solve() {
for (bool change = true ; change; ) {
change = false;
memset(used, false, sizeof(used));
for (int i = 1; i <= n; i++)
if (!L[i] && tryKuhn(i)) {
change = true;
}
}
int cnt = 0;
for (int i = 1; i <= n; i++)
if (L[i]) cnt++;
printf("%d\n", cnt);
for (int i = 1; i <= n; i++)
if (L[i])
printf("%d %d\n", i, L[i]);
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
read();
prepare();
solve();
return 0;
}