Cod sursa(job #303373)

Utilizator rethosPaicu Alexandru rethos Data 9 aprilie 2009 19:59:33
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <string.h>
#define NM 100001
#define MM 500001
int n,m;
int viz[NM];
int grad[NM];
int st[MM],vf;
struct list{int nod,viz;list *urm,*mirror;} *g[NM];
inline void add(int x,int y)
{list *p=new list;
 p->nod=y;
 p->urm=g[x];
 p->viz=0;
 g[x]=p;
 list *q=new list;
 q->nod=x;
 q->urm=g[y];
 g[y]=q;
 p->mirror=q;
 q->mirror=p;
 q->viz=0;
}
void df(int);
int main()
{freopen("ciclueuler.in","r",stdin);
 freopen("ciclueuler.out","w",stdout);
 scanf("%d %d",&n,&m);
 int i,x,y;
 for (i=1;i<=m;i++)
	 {scanf("%d %d",&x,&y);
	  add(x,y);
	  grad[x]++;
	  grad[y]++;
	 }
 df(1);
 for (i=1;i<=n;i++) if (!viz[i]||grad[i]%2==1) 
	 {printf("-1");
	  return 0; 
	 }
 vf=1;
 st[vf]=1;
 list *p;
 int sw;
 memset(viz,0,sizeof(viz));
 int nr=0;
 while (vf)
	 {x=st[vf];
	  if (grad[x]==0)
		  {nr++;
		   if (nr<=m)
			   {printf("%d ",x);
			   }
		   vf--;
		   continue;
		  }
      sw=1;  		  
	  for (p=g[x];p&&sw;p=p->urm)
		  {if (p->viz==0)
			  {grad[x]--;
			   p->viz=1;
			   p->mirror->viz=1;
			   grad[p->nod]--;
			   st[++vf]=p->nod;
			   sw=0;
			  }
		  }
	 }
 return 0;
}
void df(int k)
{viz[k]=1;
 list *p;
 for (p=g[k];p;p=p->urm)
	 if (!viz[p->nod])
		 {df(p->nod);
		 }
}