Cod sursa(job #308809)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 28 aprilie 2009 17:37:37
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<stdio.h>
#define N 100005
int n,m,*a[N],*poz[N],d[N],c[5*N];
int nr=0;

void citire(){
	int x,y;
	scanf("%d%d",&n,&m);
	while(m--){
		scanf("%d%d",&x,&y);
		d[x]++;
		if(x!=y)
			d[y]++;
	}
	fclose(stdin);
}

void aloc(){
	int i;
	for(i=1;i<=n;++i){
		a[i]=new int [1+d[i]];
		a[i][0]=0;
		poz[i]=new int [1+d[i]];
		poz[i][0]=0;
	}
}

void completez(){
	int i,x,y;
	freopen("ciclueuler.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;++i){
		scanf("%d%d",&x,&y);
		a[x][++a[x][0]]=y;
		if(x!=y)
		{
			a[y][++a[y][0]]=x;
			poz[x][a[x][0]]=a[y][0];
			poz[y][a[y][0]]=a[x][0];
		}
	}
}

void euler(int x){
	int i,y;
	for(i=1;i<=a[x][0];++i){
		y=a[x][i];
		if(y==0)
			continue;
		a[x][i]=0;
		if(x!=y)
			a[y][poz[x][i]]=0;
		euler(y);
	}
	c[++nr]=x;
}
/*
void afisare()
{
	int i,j;
	for(i=1;i<=n;++i)
	{
		printf("%d:\t",i);
		for(j=1;j<=a[i][0];++j)
			printf("(%d,poz=%d) ",a[i][j],poz[i][j]);
		printf("\n");
	}
}
*/
int main(){
	int i;
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	citire();
	aloc();
	completez();
	//afisare();
	
	euler(1);
	if(c[1]!=c[nr] || nr!=m+1)
		printf("-1");
	else
		for(i=1;i<=m;++i)
			printf("%d ",c[i]);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}