Cod sursa(job #238744)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 3 ianuarie 2009 02:00:41
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<stdio.h>
#define N 100010
int n,m,xx,yy,i,gr[N],*vec[N],pr,ul,nc,vc,q[N],gc,viz[N],nn,grad_max,ic,in;
int main()
{       //Etapa I Alcatuiesc vectorii vecinilor cu alocare dinamica
	freopen("ciclueuler.in","rt",stdin);
	freopen("ciclueuler.out","wt",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++){ scanf("%d%d",&xx,&yy);gr[xx]++;gr[yy]++;}
	for(i=1;i<=n;i++)
	{ if(gr[i]&1){printf("-1\n");return 0;}
	  //nod de gr impar => graf neeulerian =>iesire fortata
	  vec[i]=new int [gr[i]+2];gr[i]=0;
	}
	freopen("ciclueuler.in","rt",stdin);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	 { scanf("%d%d",&xx,&yy);
	   vec[xx][++gr[xx]]=yy;
	   vec[yy][++gr[yy]]=xx;
	 }

	//Etapa II Parcurgere in latime
	q[1]=1;viz[1]=1;
	pr=ul=1;
	while(pr<=ul)
	{ nc=q[pr];
	  gc=gr[nc];
	  for(i=1;i<=gc;i++)
	   { vc=vec[nc][i];
	     if(viz[vc])continue;
	     viz[vc]=1;
	     q[++ul]=vc;
	   }
	  pr++;
	}
	if(ul<n){printf("-1\n");return 0;}
	//parcurgere incompleta=>graf neconex=>neeulerian=>iesire fortata

	//Etapa III
	//Graful este eulerian=> construim drumul eulerian
	//folosim algoritmul Fleury
	nc=1;
	for(;m;m--)
	{  //tipareste nodul curent
	   printf("%d ",nc);
	   //alege un vecin de grad maxim
	   grad_max=0;nn=0;
	   for(i=1;i<=gr[nc];i++)
	    if(gr[vec[nc][i]]>grad_max){ic=i;grad_max=gr[vec[nc][i]];}
	   nn=vec[nc][ic];
	   //elimina muchia corespunzatoare
	   for(i=1;i<=gr[nn];i++)
	    if(vec[nn][i]==nc){in=i;break;}
	   vec[nc][ic]=vec[nc][gr[nc]];
	   vec[nn][in]=vec[nn][gr[nn]];
	   gr[nc]--;gr[nn]--;
	   //mergem in noul nod
	   nc=nn;
	}
	printf("\n");
	return 0;
}