Pagini recente » Cod sursa (job #1925018) | Cod sursa (job #1416372) | Cod sursa (job #945148) | Cod sursa (job #2052165) | Cod sursa (job #1140211)
/*
Keep It Simple!
*/
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include<stdio.h>
#include<list>
#include<string.h>
#define MaxN 100005
#define MaxV(a,b) ((a)>(b)?(a):(b))
using namespace std;
int N, M, K, L[MaxN], R[MaxN];
list<int> G[MaxN];
int x, y;
bool use[MaxN];
int pairup(int node)
{
if (use[node]) return 0;
use[node] = 1;
for (list<int>::iterator it = G[node].begin(); it != G[node].end(); it++)
if (!R[*it])
{
R[*it] = node;
L[node] = *it;
return 1;
}
for (list<int>::iterator it = G[node].begin(); it != G[node].end(); it++)
if (pairup(R[*it]))
{
L[node] = *it;
R[*it] = node;
return 1;
}
return 0;
}
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
scanf("%d%d%d", &N, &M, &K);
for (int i = 1; i <= K; i++)
{
scanf("%d%d", &x, &y);
G[x].push_back(y);
}
for (int change = 1; change;)
{
change = 0;
memset(use, 0, sizeof(use));
for (int j = 1; j <= N; j++) if (!L[j])
change |= pairup(j);
}
int S = 0;
for (int i = 1; i <= N; i++)
if (L[i]) S++;
printf("%d\n", S);
for (int i = 1; i <= N; i++)
if (L[i])
printf("%d %d\n", i, L[i]);
}