Cod sursa(job #308822)

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

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");
	}
}
*/
void euler(int x)
{
	int k=1,y;
	stvf[k]=x;
	stvec[k]=0;
	while(k)
	{
		x=stvf[k];
		if(stvec[k]<a[x][0])
		{
			y=a[x][++stvec[k]];
			if(y==0)
				continue;
			a[x][stvec[k]]=0;
			if(x!=y)
				a[y][poz[x][stvec[k]]]=0;
			stvf[++k]=y;
			stvec[k]=0;
			continue;
		}
		c[++nr]=x;
		--k;
	}
}

void dfs(int x){
	
}

bool ver(){
	int ok=1,i;
	for(i=1;i<=n&&ok;++i)
		if(d[i]%2==1)
			return false;
	return true;
}

int main(){
	int i;
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	citire();
	aloc();
	completez();
	//afisare();
	
	euler(1);
	if(!ver())
		printf("-1\n");
	else
		for(i=1;i<=nr;++i)
			printf("%d ",c[i]);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}