Pagini recente » Borderou de evaluare (job #1004099) | Cod sursa (job #2397399) | Cod sursa (job #2384907) | Cod sursa (job #2536478) | Cod sursa (job #1969571)
#include <bits/stdc++.h>
#define maxN 20002
using namespace std;
FILE *fin = freopen("cuplaj.in", "r", stdin);
FILE *fout = freopen("cuplaj.out", "w", stdout);
/* ==================== */
int n, m, e;
/* ==================== */
vector < int > V[maxN];
bool vis[maxN];
int Pair[maxN];
/* ==================== */
struct Matching
{
int x, y;
} ans[maxN];
int len;
/* ==================== */
bool PairUp(int x)
{
if (vis[x])
return 0;
vis[x] = 1;
for (int y : V[x])
if (Pair[y] == -1 || PairUp(Pair[y]))
{
Pair[x] = y;
Pair[y] = x;
return 1;
}
return 0;
}
int main()
{
scanf("%d %d %d", &n, &m, &e);
for (int i = 1; i <= e; ++ i)
{
int x, y;
scanf("%d %d", &x, &y);
V[x].push_back(y + n);
V[y + n].push_back(x);
}
for (int i = 1; i <= n + m; ++ i)
Pair[i] = -1;
bool ok = 0;
do
{
ok = 0;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; ++ i)
if (Pair[i] == -1)
ok |= PairUp(i);
}
while (ok);
for (int i = 1; i <= n; ++ i)
if (Pair[i] != -1)
ans[++ len] = {i, Pair[i] - n};
printf("%d\n", len);
for (int i = 1; i <= len; ++ i)
printf("%d %d\n", ans[i].x, ans[i].y);
return 0;
}