Pagini recente » Cod sursa (job #563388) | Cod sursa (job #1325991) | Cod sursa (job #2534939) | Cod sursa (job #1929313) | Cod sursa (job #1217123)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 100005;
int l[maxn], r[maxn], u[maxn];
vector <int> G[maxn];
int pairup(const int n)
{
if (u[n]) return 0;
u[n] = 1;
for (vector <int> :: iterator it = G[n].begin(); it != G[n].end(); ++it) if (!r[*it]) {
l[n] = *it;
r[*it] = n;
return 1;
}
for (vector <int> :: iterator it = G[n].begin(); it != G[n].end(); ++it) if (pairup(r[*it])) {
l[n] = *it;
r[*it] = n;
return 1;
}
return 0;
}
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
int n, m, edges;
scanf("%d %d %d", &n, &m, &edges);
for (; edges --; )
{
int x, y;
scanf("%d %d", &x, &y);
G[x].push_back(y);
}
for (int change = 1; change; )
{
change = 0;
memset(u, 0, sizeof(u));
for (int i = 1; i <= n; ++i) if (!l[i])
change |= pairup(i);
}
int cuplaj = 0;
for (int i = 1; i <= n; ++i) cuplaj += (l[i] > 0);
printf("%d\n", cuplaj);
for (int i = 1; i <= n; ++i) if (l[i] > 0)
printf("%d %d\n", i, l[i]);
return 0;
}