Cod sursa(job #578408)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 11 aprilie 2011 11:45:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
#define NM 10001
#define pb push_back
#define sh short int
#define II inline
sh N,M,x,y,r[NM],l[NM];
vector<sh>a[NM];
bitset<NM>viz;
int E;
II void citire()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%hd%hd%d",&N,&M,&E);
	for (int i=1; i<=E; ++i)
	{
		scanf("%hd%hd",&x,&y);
		a[x].pb(y);
	}
}
II bool pairup(sh nod)
{
	if (viz[nod])
		return 0;
	viz[nod]=1;
	vector<sh >:: iterator it=a[nod].begin(),e=a[nod].end();
	for (; it!=e; ++it)
	{
		if (r[*it])
			continue;
		r[*it]=nod;
		l[nod]=*it;
		return 1;
	}
	it=a[nod].begin();
	for (; it!=e; ++it)
	{
		if (!pairup(r[*it]))
			continue;
		r[*it]=nod;
		l[nod]=*it;
		return 1;
	}
	/*int g=a[nod].size();
	for (int i=0; i<g; ++i)
	{
		y=a[nod][i];
		if (!r[y] )
		{
			r[y]=nod;
			l[nod]=y;
			return 1;
		}
	}
	for (int i=0; i<g; ++i)
	{
		y=a[nod][i];
		if (pairup(r[y]) )
		{
			r[y]=nod;
			l[nod]=y;
			return 1;
		}
	}*/
	return 0;
}
II void cuplaj()
{
	bool ch=1;
	while (ch)
	{
		ch=0;
		viz.reset();
		for (int i=1; i<=N; ++i)
			if (!l[i])
				ch|=pairup(i);
	}
}
II void afis()
{
	sh nr=0;
	for (int i=1; i<=N; ++i)
		nr+=(l[i]>0);
	printf("%hd\n",nr);
	for (int i=1; i<=N; ++i)
		if (l[i]>0)
			printf("%hd %hd\n",i,l[i]);
}
int main()
{
	citire();
	cuplaj();
	afis();
	return 0;
}