Cod sursa(job #390257)

Utilizator raduzerRadu Zernoveanu raduzer Data 3 februarie 2010 13:06:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

#define pb push_back
#define forit(it, v) for(__typeof(v.begin()) it = v.begin(); it != v.end(); ++it)

const int MAX_N = 10010;

int n, m, k, sol;
int f[MAX_N], c[MAX_N], d[MAX_N];
vector <int> v[MAX_N];

inline int make(int nod, int fiu)
{
	c[fiu] = nod;
	return d[nod] = 1;
}

inline int cuplaj(int nod)
{
	if (f[nod])
		return 0;
	f[nod] = 1;

	forit(it, v[nod])
		if (!c[*it])
			return make(nod, *it);

	forit(it, v[nod])
		if (c[*it] != nod && cuplaj(c[*it]))
			return make(nod, *it);

	return 0;
}

int main()
{
	int i, j, x, y;
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);

	scanf("%d %d %d", &n, &m, &k);

	for (i = 1; i <= k; ++i)
	{
		scanf("%d %d", &x, &y);

		v[x].pb(y);
	}

	int ok = 1;

	while (ok)
	{
		ok = 0;

		memset(f, 0, sizeof(f));

		for (i = 1; i <= n; ++i)
		{
			int q = (d[i]) ? 0 : cuplaj(i);

			sol += q;
			ok |= q;
		}
	}

	printf("%d\n", sol);

	for (i = 1; i <= m; ++i)
		if (c[i])
			printf("%d %d\n", c[i], i);
}