Cod sursa(job #391897)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 6 februarie 2010 14:15:47
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>


#define file_in "ciclueuler.in"
#define file_out "ciclueuler.out"

#define Nmax 1001000

int n,m,i,st[Nmax],vf,grad[Nmax],sol[Nmax],t[Nmax],k,j;
struct ce
{
	int x,q;
}
a[Nmax];

int main()
{
	int i,x,y;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d",&n, &m);

	k=0;
	for (j=1;j<=m;++j)
	{
		scanf("%d %d", &x, &y);
		grad[x]++;
		grad[y]++;
		a[++k].x=y;
		a[k].q=t[x];
		t[x]=k;
		a[++k].x=x;
		a[k].q=t[y];
		t[y]=k;	
	}
	
	for (i=1;i<=n;++i)
		 if (grad[i]&1)
		 {
			 printf("-1\n");
			 return 0;
		 }
		 
    
	k=0;
    st[1]=1;	
	vf=1;
    while(vf>0)
	{
		x=st[vf];
		if (t[x]==0)
		{
			k++;
			sol[k]=x;
			vf--;
		}
		else
		{
			i=t[x];
			y=a[i].x;
			st[++vf]=y;
			t[x]=a[i].q;
			i=t[y];
			if (a[i].x==x)
			    t[y]=a[i].q;
			else
			{
				while(a[a[i].q].x!=x)
					i=a[i].q;
				a[i].q=a[a[i].q].q;
			}
		}
	}
	
	for (i=1;i<=m;++i)
		 printf("%d ", sol[i]);

	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}