Pagini recente » Cod sursa (job #2252716) | Cod sursa (job #163307) | Cod sursa (job #1095337) | Cod sursa (job #2944276) | Cod sursa (job #229362)
Cod sursa(job #229362)
#include <cstdio>
#include <vector>
using namespace std;
#define L(i) ((i))
#define R(i) ((i) + NL)
#define MAXN 10005
int NL, NR, M;
vector<int> con[MAXN], l, r;
vector<bool> used;
inline int PairUp(int k)
{
if (used[k])
return 0;
used[k] = true;
vector<int> :: iterator it;
for (it = con[k].begin(); it != con[k].end(); it++)
{
if (r[*it] == -1 || PairUp(r[*it]))
{
l[k] = *it;
r[*it] = k;
return 1;
}
}
return 0;
}
int main()
{
freopen("cuplaj.in", "rt", stdin);
freopen("cuplaj.out", "wt", stdout);
scanf("%d %d %d", &NL, &NR, &M);
for (; M; M--)
{
int l, r;
scanf("%d %d", &l, &r);
l--; r--;
con[L(l)].push_back(R(r));
}
l.resize(NL, -1);
r.resize(NL + NR, -1);
for (int ok = 0; !ok; )
{
ok = 1;
used.clear();
used.resize(NL, false);
for (int i = 0; i < NL; i++)
if (l[L(i)] == -1 && PairUp(L(i)))
ok = 0;
}
int Nr = 0;
for (int i = 0; i < NL; i++)
if (l[L(i)] != -1)
Nr++;
printf("%d\n", Nr);
for (int i = 0; i < NL; i++)
if (l[L(i)] != -1)
printf("%d %d\n", i + 1, l[L(i)] - NL + 1);
return 0;
}