Cod sursa(job #308541)

Utilizator andreea_mandreea martinovici andreea_m Data 27 aprilie 2009 17:47:09
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#define N 100005
#define M 500008
int n,m,*a[N],x[M],y[M],d[N],c[M],*poz[N],nr=0;
void citire()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x[i],&y[i]);
		++d[x[i]];
		if(x[i]!=y[i])
			++d[y[i]];
	}
	for(int i=1;i<=n;i++)
	{
		a[i]=new int[d[i]+1];
		poz[i]=new int [d[i]+1];
		a[i][0]=0;
	}
	for(int i=1;i<=m;i++)
	{
		a[x[i]][++a[x[i]][0]]=y[i];
		if(x[i]!=y[i])
		{
			a[y[i]][++a[y[i]][0]]=x[i];
			poz[x[i]][a[x[i]][0]]=a[y[i]][0];
			poz[y[i]][a[y[i]][0]]=a[x[i]][0];
		}
	}
}
void afisareproba()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=a[i][0];j++)
			printf("%d ",a[i][j]);
		printf("\n");
	}
}

void afisare()
{
	for(int i=1;i<nr;i++)
		printf("%d ",c[i]);
}

void euler(int x)
{
	int i,j,y;
	for(i=1;i<=a[x][0];i++)
		if(a[x][i])
		{
			y=a[x][i];
			a[x][i]=0;
			if(x!=y)
			{
				j=poz[x][i];
				a[y][j]=0;
			}
			euler(y);
		}
	c[++nr]=x;
}
int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	citire();
	euler(1);
	
	if(nr==m+1)
		afisare();
	else
		printf("-1");
	
	//afisareproba();
	return 0;
}