Cod sursa(job #370864)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 2 decembrie 2009 17:05:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define nmax (10*1001)
#define lmax (100*1001)
struct list
{
	int n,p; //nodul si pozitia urmatoare
} l[lmax]; //lista grafului normal
char viz[nmax]; //vizite
int le[nmax]; //le[i]=cu ce nod din partea dreapta e legat nodul i din partea stanga
int ri[nmax]; //ri[i]=cu ce nod din partea stanga e legat nodul i din partea dreapta
int p[nmax]; //pozitia catre lista a nodurilor primului graf
int n,m; //numarul de noduri ale celor doua grafuri
int nr; //numarul maxim de cuplari

void add(int poz, int x, int y)
{
	l[poz].p=p[x]; l[poz].n=y; p[x]=poz;
}

void read()
{
	int i,k,u,v;
	scanf("%d %d %d\n",&n,&m,&k);
	for(i=1;i<=k;i++)
	{
		scanf("%d %d\n",&u,&v);
		add(i,u,v);
	}
}

int imperechere(int i)
{
	if(viz[i]) return 0;
	viz[i]=1;
	int j;
	for(j=p[i];j;j=l[j].p)
		if(!ri[l[j].n] || imperechere(ri[l[j].n]))
		{
			le[i]=l[j].n;
			ri[l[j].n]=i;
			return 1;
		}
	return 0;
}

void cuplaj()
{
	int i,ok=1;
	while(ok)
	{
		ok=0;
		for(i=1;i<=n;i++) viz[i]=0;
		for(i=1;i<=n;i++)
			if(!le[i] && imperechere(i))
				ok=1,nr++;
	}
}

void write()
{
	int i;
	printf("%d\n",nr);
	for(i=1;i<=n;i++)
		if(le[i])
			printf("%d %d\n",i,le[i]);
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	cuplaj();
	write();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}