Cod sursa(job #245355)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 17 ianuarie 2009 20:58:23
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
using namespace std;

#include <bitset>
#include <vector>

#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define mp make_pair
#define IN  "ciclueuler.in"
#define OUT "ciclueuler.out"
#define N_MAX 1<<17
#define M_MAX 1<<19

int last,N,M;
vector<int> A[N_MAX];
int stv[M_MAX],nr[M_MAX],Q[M_MAX],G[N_MAX],X[M_MAX],Y[M_MAX];
bool viz[M_MAX];

int main()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d %d",&N,&M);
	
	FOR(i,1,M)
	{
		scanf("%d %d",X+i,Y+i);
		
		A[X[i]].pb(i);
		A[Y[i]].pb(i);
		++G[X[i]],++G[Y[i]];
	}	
	FOR(i,1,N)
		if(G[i]&1)
		{
			printf("-1\n");
			return 0;
		}	

	int top(0),vx;
	for(stv[++top] = 1;top;)
	{
		for(;nr[top] < G[ stv[top] ] && last + top != M+1;)
		{
			vx = A[stv[top]][nr[top]++];
			
			if(viz[vx])
				continue;
			
			viz[vx] = true;
			stv[++top] = (stv[top-1] == X[vx]?Y[vx]:X[vx]);
			nr[top] = 0;
		}
		
		Q[++last] = stv[top--];
	}	
	if(--last < M)
	{
		printf("-1\n");
		return 0;
	}
	FOR(i,1,last)
		printf("%d ",Q[i]);
	return 0;
}