Cod sursa(job #308827)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 28 aprilie 2009 18:28:44
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 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],x[5*N],y[5*N];
int nr=0,viz[N];

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]]++;
	}
	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;
		d[i]=0;
	}
}

void completez(){
	int i;
	for(i=1;i<=m;++i){
		a[x[i]][++a[x[i]][0]]=y[i];
		++d[x[i]];
		++d[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 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 z)
{
	int k=1,t;
	stvf[k]=z;
	stvec[k]=0;
	while(k)
	{
		z=stvf[k];
		if(stvec[k]<a[z][0])
		{
			t=a[z][++stvec[k]];
			if(t==0)
				continue;
			a[z][stvec[k]]=0;
			if(z!=t)
				a[t][poz[z][stvec[k]]]=0;
			stvf[++k]=t;
			stvec[k]=0;
			continue;
		}
		c[++nr]=z;
		--k;
	}
}

bool ver(){
	int i;
	for(i=1;i<=n;++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;
}