Pagini recente » Cod sursa (job #605549) | Cod sursa (job #3196816) | Cod sursa (job #2047716) | Statistici Lazareanu Vlad (la.za) | Cod sursa (job #1909690)
#include <bits/stdc++.h>
using namespace std;
const int nMax = 1e4 + 2;
int n, m, e, l[nMax], r[nMax];
vector<int>g[nMax];
bool vis[nMax];
void read() {
scanf("%d%d%d", &n, &m, &e);
for (int i = 1; i <= e; ++i) {
int from, to;
scanf("%d%d", &from, &to);
g[from].push_back(to);
}
}
bool canMatch(int node) {
if (vis[node])
return false;
vis[node] = true;
for (const auto &itr : g[node]) {
if (!l[itr] or canMatch(l[itr])) {
r[node] = itr;
l[itr] = node;
return true;
}
}
return false;
}
void maxMatching() {
for (bool ok = 1; ok;) {
ok = 0;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; ++i)
if (!r[i]) {
ok |= canMatch(i);
}
}
}
void printMatching() {
int card = 0;
for (int i = 1; i <= n; ++i)
if (r[i] != 0)
card++;
printf("%d\n", card);
for (int i = 1; i <= n; ++i)
if (r[i] != 0)
printf("%d %d\n", i, r[i]);
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
read();
maxMatching();
printMatching();
return 0;
}