Cod sursa(job #615761)

Utilizator moonbeamElma Moonbeam moonbeam Data 10 octombrie 2011 19:37:13
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
#define pb push_back
#define NM 10001
bitset<NM>viz;
int l[NM],r[NM];
vector<int>a[NM];
bool pairup(int nod)
{
	if (viz[nod])
		return 0;
	viz[nod]=1;
	vector<int>::iterator it=a[nod].begin(),end=a[nod].end();
	for (;it!=end;++it)
		if (!r[*it])
		{
			l[nod]=*it;
			r[*it]=nod;
			return 1;
		}
	it=a[nod].begin();
	for (;it!=end;++it)
		if (pairup(r[*it]))
		{
			l[nod]=*it;
			r[*it]=nod;
			return 1;
		}
	return 0;
}
int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	int N,M,L,x,y;
	scanf("%d%d%d",&N,&M,&L);
	while (L--)
	{
		scanf("%d%d",&x,&y);
		a[x].pb(y);
	}
	bool ch=1;
	while (ch)
	{
		ch=0;
		viz.reset();
		for (int i=1; i<=N; ++i)
			if (!l[i])
				ch|=pairup(i);
	}
	int nr=0;
	for (int i=1; i<=N; ++i) nr+=(l[i]!=0);
	printf("%d\n",nr);
	for (int i=1; i<=N; ++i)
		if (l[i])
			printf("%d %d\n",i,l[i]);
	return 0;
}