Pagini recente » Cod sursa (job #260944) | Cod sursa (job #2964415) | Cod sursa (job #2668861) | Cod sursa (job #2926104) | Cod sursa (job #1687382)
#include <bits/stdc++.h>
#define left(x) (x)
#define right(x) ((x)+10000)
using namespace std;
const int nmax = 1e4 + 10;
int n , m , e , i , ans;
int cuplat[nmax<<1];
bool ap[nmax<<1];
vector < int > g[nmax];
bool pairup(int node)
{
ap[left(node)] = 1;
for (auto &it : g[node])
{
if (cuplat[right(it)]) continue;
cuplat[left(node)] = it;
cuplat[right(it)] = node;
return 1;
}
for (auto &it : g[node])
{
if (ap[cuplat[right(it)]]) continue;
if (!pairup(cuplat[right(it)])) continue;
cuplat[left(node)] = it;
cuplat[right(it)] = node;
return 1;
}
return 0;
}
void bagacuplaj()
{
while (true)
{
bool ok = 0;
memset(ap , 0 , sizeof(ap));
for (int i = 1; i <= n; ++i)
{
if (cuplat[left(i)] || ap[left(i)]) continue;
ok |= pairup(i);
}
if (!ok) break;
}
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d", &n, &m, &e);
for (i = 1; i <= e; ++i)
{
int x , y;
scanf("%d %d", &x, &y);
g[x].push_back(y);
}
bagacuplaj();
for (i = 1; i <= n; ++i)
if (cuplat[left(i)]) ans++;
printf("%d\n", ans);
for (i = 1; i <= n; ++i)
{
if (!cuplat[left(i)]) continue;
printf("%d %d\n", left(i) , cuplat[left(i)]);
}
return 0;
}