Cod sursa(job #303474)

Utilizator rethosPaicu Alexandru rethos Data 9 aprilie 2009 21:11:48
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#define NM 100001
#define MM 500001
int *a[NM];
int x[MM],y[MM];
int viz[NM];
int st[MM];
int vf,nr;
void df(int);
inline void swap(int &x,int &y)
{int aux=x;
 x=y;
 y=aux;
}
int n,m,grad[NM];
int main()
{freopen("ciclueuler.in","r",stdin);
 freopen("ciclueuler.out","w",stdout);
 scanf("%d %d",&n,&m);
 int i,c,d;
 for (i=1;i<=m;i++)
	 {scanf("%d %d",&c,&d);
	  x[i]=c;
	  y[i]=d;
	  grad[d]++;
	  grad[c]++;
	 }
 for (i=1;i<=n;i++)
	  {a[i]=new int[grad[i]+1];
	   a[i][0]=0;
	  }
 for (i=1;i<=m;i++)
	 {a[x[i]][0]++;
	  a[x[i]][a[x[i]][0]]=y[i];
	  a[y[i]][0]++;
	  a[y[i]][a[y[i]][0]]=x[i];
	 }
 df(1);	 
 for (i=1;i<=n;i++)
	 if (grad[i]%2==1||viz[i]==0)
		 {printf("-1");
		  return 0;
		 }
 vf=1;
 st[vf]=1;
 int x,y;
 while (vf)
	 {x=st[vf];
	  if (a[x][0]==0)
		  {nr++;
		   if (nr<=m)
			  {printf("%d ",x);
			  }
		   vf--;
		   continue;
		  }
	  y=a[x][a[x][0]];
	  if (y>n)
		  {i=i;
		   i=i;
		   viz[x]=x;
		  }
	  for (i=1;i<=a[y][0];i++)
		  {if (a[y][i]==x)
			  {swap(a[y][i],a[y][a[y][0]]);
			   break;
			  }
		  }
	   a[x][0]--;
	   if (i<=a[y][0]) a[y][0]--;
	   st[++vf]=y;
	  }
 return 0;
}
void df(int k)
{viz[k]=1;
 int i;
 for (i=1;i<=a[k][0];i++)
	 if (!viz[a[k][i]])
		 {df(a[k][i]);
		 }
}