Pagini recente » Istoria paginii utilizator/rosu_delia | Cod sursa (job #2034287) | Cod sursa (job #409464) | Cod sursa (job #1034253) | Cod sursa (job #2017609)
#include <bits/stdc++.h>
const int MAX_N = 10000;
const int MAX_M = 10000;
std::vector<int>E[1 + MAX_N];
int l[1 + MAX_N];
int r[1 + MAX_N];
bool viz[1 + MAX_N];
int n, m, e;
bool match(int nod) {
if (viz[nod])
return false;
viz[nod] = 1;
for (auto it:E[nod]) {
if (l[it] == 0) {
r[nod] = it;
l[it] = nod;
return true;
}
}
for (auto it:E[nod]) {
if (!viz[l[it]] && match(l[it])) {
r[nod] = it;
l[it] = nod;
return true;
}
}
return false;
}
void cuplaj() {
bool ok;
do {
ok = false;
memset(viz, 0, sizeof(viz));
for (int i = 1; i <= n; ++i) {
if (r[i] == 0 && match(i))
ok = true;
}
} while (ok);
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
scanf("%d%d%d", &n, &m, &e);
for (int i = 1; i <= e; ++i) {
int u, v;
scanf("%d%d", &u, &v);
E[u].push_back(v);
}
cuplaj();
int k = 0;
for (int i = 1; i <= n; ++i)
if (r[i])
k++;
printf("%d\n", k);
for (int i = 1; i <= n; ++i)
if (r[i])
printf("%d %d\n", i, r[i]);
return 0;
}