Cod sursa(job #1140211)

Utilizator roby2001Sirius roby2001 Data 11 martie 2014 20:22:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
/*
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]);
}