Cod sursa(job #303403)
# include <cstdio>
# include <algorithm>
using namespace std;
# define FIN "cuplaj.in"
# define FOUT "cuplaj.out"
# define MAXN 10005
struct Nod
{
int Vecin;
Nod *next;
} *Graf[MAXN], *p;
int N, M, E, i, ct, ok;
int l[MAXN], r[MAXN], s[MAXN];
int PairUp(int N)
{
Nod *p;
if (s[N]) return 0;
s[N] = 1;
for (p = Graf[N]; p != NULL; p = p -> next)
if (!l[p -> Vecin])
{
l[p -> Vecin] = N;
r[N] = p -> Vecin;
return 1;
}
for (p = Graf[N]; p != NULL; p = p -> next)
if (PairUp(l[p -> Vecin]))
{
l[p -> Vecin] = N;
r[N] = p -> Vecin;
return 1;
}
return 0;
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d%d%d", &N, &M, &E);
int a, b;
for (i = 1; i <= E; ++i)
{
scanf("%d%d", &a, &b);
p = new Nod; p -> Vecin = b; p -> next = Graf[a]; Graf[a] = p;
}
ct = 0; ok = 1;
while (ok)
{
ok = 0;
memset(s, 0, sizeof(s));
for (i = 1; i <= N; ++i)
if (!r[i])
if (PairUp(i))
{
++ct;
ok = 1;
}
}
printf("%d\n", ct);
for (i = 1; i <= N; ++i)
if (r[i]) printf("%d %d\n", i, r[i]);
return 0;
}