Cod sursa(job #419314)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 17 martie 2010 11:59:17
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>
#include<string.h>
#define Nmax 10010
struct nod
{
	int inf;
	nod *urm;
}*a[Nmax];
int l[Nmax],r[Nmax],viz[Nmax],n,m,e;

int cuplaj(int s)
{
	if(viz[s]) return 0;
	viz[s]=1;
	nod *p;
	for(p=a[s];p!=NULL;p=p->urm)
		if(r[p->inf]==0)
		{
			l[s]=p->inf;
			r[p->inf]=s;
			return 1;
		}
	for(p=a[s];p!=NULL;p=p->urm)
		if(cuplaj(r[p->inf]))
		{
			l[s]=p->inf;
			r[p->inf]=s;
			return 1;
		}
	return 0;
}

int main()
{
	freopen ("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d %d %d",&n,&m,&e);
	nod *p;
	int x,y;
	for(int i=0;i<e;i++)
	{	scanf("%d %d",&x,&y);
		p=new nod;
		p->inf=y;
		p->urm=a[x];
		a[x]=p;
	}
/*	for(int i=1;i<=n;i++)
	{
		if(!cuplaj(i))
		{
			memset(viz,0,sizeof(viz));
			cuplaj(i);
		}
	}
*/
	int ok=1;
	while(ok)
	{
		ok=0;
		memset(viz,0,sizeof(viz));
		for(int i=1;i<=n;i++)
			if(!l[i])
				ok|=cuplaj(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;
}