Cod sursa(job #291388)

Utilizator IeewIordache Bogdan Ieew Data 29 martie 2009 18:52:56
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <stdio.h>
#define NMAX 10001
int n,m,k,ok;
int v[NMAX],w[NMAX];
int *a[NMAX],*b[NMAX],viz[NMAX],e_cuplat[NMAX],viz2[NMAX],vizm1[NMAX];
int sol=0;
void clear(int *a,int n)
{int i;
for(i=1;i<=n;i++)a[i]=0;
}

void copiaza()
{int i;

for(i=1;i<=m;i++)
 if(viz2[i])
  {
	viz[i]=viz2[i];
	e_cuplat[viz[i]]=i;
  }
}

void rec(int nod,int multime)
{int i,*y,u,m;
 u=w[nod];
 y=b[nod];
 m=1;
 if(multime==1){u=v[nod];y=a[nod];m=2;}

 if(multime==1&&!e_cuplat[nod])
	{
	 ok=1;
	 copiaza();
	 return ;
	}

 if(multime==2)
 for(i=1;i<=u;i++)
	if(y[i]!=viz[nod]&&!vizm1[y[i]])
		{
		 viz2[nod]=y[i];
		 vizm1[y[i]]=nod;
		 rec(y[i],m);
		 viz2[nod]=0;
		 vizm1[y[i]]=0;
		 if(ok)break;
		}
 if(multime==1)rec(e_cuplat[nod],m);
}

int main()
{int i,x,y,j;
// clrscr();
 freopen("cuplaj.in","r",stdin);
 scanf("%d%d%d",&n,&m,&k);
 for(i=1;i<=k;i++)
 {
	scanf("%d%d",&x,&y);
	v[x]++;
	w[y]++;
 }
 for(i=1;i<=n;i++)
	{
	 a[i]=new int[v[i]+1];
	 v[i]=0;
	 b[i]=new int[w[i]+1];
	 w[i]=0;
	}
 fseek(stdin,0,0);
 scanf("%d%d%d",&n,&m,&k);
 for(i=1;i<=k;i++)
 {
	scanf("%d%d",&x,&y);
	a[x][++v[x]]=y;
	b[y][++w[y]]=x;
 }
 fclose(stdin);
 for(i=1;i<=n;i++)
	{
	 for(j=1;j<=v[i]&&!e_cuplat[i];j++)
		{
		 x=a[i][j];
		 if(!viz[x]){viz[x]=i;e_cuplat[i]=x;a[i][j]*=-1;}
		}
	}
 //for(i=1;i<=m;i++)cout<<i<<' '<<viz[i]<<'\n';
 ok=1;
 while(ok)
 {
  ok=0;
  for(i=1;i<=m;i++)
	if(!viz[i])
	 {
	  clear(viz2,m);
	  clear(vizm1,n);
	  rec(i,2);
	  if(ok)break;
	 }
 }
 freopen("cuplaj.out","w",stdout);
 for(i=1;i<=m;i++)
	if(viz[i])sol++;
 printf("%d%c",sol,'\n');

 for(i=1;i<=m;i++)
	if(viz[i])
		printf("%d%c%d%c",viz[i],' ',i,'\n');
 fclose(stdout);
 return 0;
}