Cod sursa(job #409721)

Utilizator alex3el_n2oAlex Vladescu alex3el_n2o Data 3 martie 2010 20:24:08
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
#include<string.h>
#define NMAX 10100
#define MMAX 100100
int y[NMAX],z[NMAX],l[NMAX],r[NMAX],d[NMAX],*x[NMAX],i,j,n,m,k,p,a,b;
struct kkt
{
	int X,Y;
};
kkt q[MMAX];
int pairup(int nod)
{
	if (z[nod])
		return 0;
	z[nod]=1;
	for (int i=1;i<=x[nod][0];i++)
		if (!r[x[nod][i]])
		{
			l[nod]=x[nod][i];
			r[x[nod][i]]=nod;
			return 1;
		}
	for (i=1;i<=x[nod][0];i++)
		if (pairup(r[x[nod][i]]))
		{
			l[nod]=x[nod][i];
			r[x[nod][i]]=nod;
			return 1;
		}
	return 0;
}
int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d%d%d",&n,&m,&p);
	for (i=1;i<=p;i++)
	{
		scanf("%d%d",&q[i].X,&q[i].Y);
		z[q[i].X]++;
	}
	for (i=1;i<=n;i++)
	{
		x[i]= new int [z[i]+2];
		x[i][0]=0;
	}
	for (i=1;i<=p;i++)
		x[q[i].X][++x[q[i].X][0]]=q[i].Y;
	a=1;
	while (a)
	{
		a=0;
		memset(z,0,sizeof(z));
		for (i=1;i<=n;i++)
			if (!l[i])
				a+=pairup(i);
	}
	a=0;
	for (i=1;i<=n;i++)
		if (l[i])
			a++;
	printf("%d\n",a);
	for (i=1;i<=n;i++)
		if (l[i])
			printf("%d %d\n",i,l[i]);

	return 0;
}