Cod sursa(job #293477)

Utilizator cotofanaCotofana Cristian cotofana Data 1 aprilie 2009 20:57:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define dim 10100

using namespace std;

int n, m, l[dim], r[dim], fol[dim];
vector<int> g[dim];

int pairup(int x)
{
	vector<int>::iterator it;
	if (fol[x]) return 0;
	fol[x]=1;
	for (it=g[x].begin(); it!=g[x].end(); it++)
		if (!r[*it])
		{
			l[x]=*it;
			r[*it]=x;
			return 1;
		}
	for (it=g[x].begin(); it!=g[x].end(); it++)
		if (pairup(r[*it]))
		{
			l[x]=*it;
			r[*it]=x;
			return 1;
		}
	return 0;
}

int main()
{
	int i, x, y, count;
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
	scanf("%d %d %d\n", &n, &m, &i);
	for (; i; i--)
	{
		scanf("%d %d\n", &x, &y);
		g[x].push_back(y);
	}
	for (count=1; count;)
	{
		count=0;
		memset(fol, 0, sizeof(fol));
		for (i=1; i<=n; i++)
			if (!l[i]) count|=pairup(i);
	}
	count=0;
	for (i=1; i<=n; i++)
		count+=(l[i]>0);
	printf("%d\n", count);
	for (i=1; i<=n; i++)
		if (l[i]) printf("%d %d\n", i, l[i]);
	return 0;
}