Cod sursa(job #403784)

Utilizator GotenAmza Catalin Goten Data 25 februarie 2010 11:58:55
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>

int sol[500100],ver[1000100],leg[1000100],pus[1000100],start[100100],q,k,st[500100],grad[100100],viz[100100],n;

int ok()
{
	int u=1,p=1,t,i;
	for(i=1;i<=n;i++)
		if(grad[i]%2)
			return 0;
	st[1]=1;
	viz[1]=1;
	while(p<=u)
	{
		t=start[st[p]];
		while(t)
		{
			if(!viz[ver[t]])
			{
				st[++u]=ver[t];
				viz[ver[t]]=1;
			}
			t=leg[t];
		}
	p++;
	}
	if(u!=n)
		return 0;
	return 1;
}

int main()
{
	int m,i,x,y,t;
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d %d",&x,&y);
		ver[++q]=y;
		leg[q]=start[x];
		start[x]=q;
		ver[++q]=x;
		leg[q]=start[y];
		start[y]=q;
		grad[x]++;
		grad[y]++;
	}
	if(!ok())
	{
		printf("%d",-1);
		return 0;
	}
	q=0;
	st[++k]=1;
	while(k)
	{
		t=start[st[k]];
		if(t)
		{
			start[st[k]]=leg[t];
			if(!pus[t])
			{
				pus[t]=1;
				if(t%2)
					pus[t+1]=1;
				else
					pus[t-1]=1;
				st[++k]=ver[t];
			}
		}
		else
			sol[++q]=st[k--];
	}
	for(i=1;i<q;i++)
		printf("%d ",sol[i]);
	return 0;
}