Cod sursa(job #408796)

Utilizator hasegandaniHasegan Daniel hasegandani Data 3 martie 2010 11:18:16
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<stdio.h>

#define Nmax 100010
#define Mmax 500010

struct nod
{
	int drum;
	nod *urm;
} *l[Nmax];

int N,st[Mmax],vf,nr[Nmax];

void sterge(nod *&inc,int info)
{
	if (inc->drum==info)
	{
		nod *q=inc;
		inc=inc->urm;
		delete q;
		return ;
	}
	for(nod *t=inc; t->urm ; t=t->urm)
		if ((t->urm)->drum==info)
		{
			nod *q=t->urm;
			t->urm=q->urm;
			delete q;
			return ;
		}
}

int wrong()
{
	for(int i=1;i<=N;++i)
		if (nr[i]%2==1)
			return 1;
	return 0;
}

void solve()
{
	if (wrong())
	{
		printf("-1\n");
		return ;
	}
	
	st[++vf]=1;
	
	int nod,leg;
	for(; vf ;)
	{
		nod=st[vf];
		if (l[ nod ])
		{
			leg=l[nod]->drum;
			st[++vf]=leg;
			
			l[nod]= l[nod]->urm;
			sterge(l[leg],nod);
		}
		else
		{
			if (vf>1)
				printf("%d ",nod);
			--vf;
		}
	}
	printf("\n");
	
}

void cit();
void add(nod *&inc,int info)
{
	nod *p=new nod;
	p->drum=info;
	p->urm=inc;
	inc=p;
}

int main()
{
	cit();
	solve();
	return 0;
}

void cit()
{
	int a,b,M;
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d%d",&N,&M);
	for(; M ;--M)
	{
		scanf("%d%d",&a,&b);
		nr[a]++;
		nr[b]++;
		add(l[a],b);
		add(l[b],a);
	}
}