Cod sursa(job #245182)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 17 ianuarie 2009 00:03:43
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 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;
typedef pair<int,int> pi;
vector<int> A[N_MAX];
int stv[M_MAX],nr[M_MAX],Q[M_MAX],G[N_MAX],V[N_MAX],X[M_MAX],Y[M_MAX];
bool viz[M_MAX];

II void scan()
{
	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]];
		if(X[i]==Y[i])
			++V[X[i]];
	}	
	FOR(i,1,N)
		if(G[i]&1)
		{
			printf("-1\n");
			exit(0);
		}	
}

II void euler()
{
	int i,top(0),nod(1);
	
	for(stv[++top] = 1;nod;)
	{
		for(;nr[top] < G[ stv[top] ];)
		{
			i = nr[top]++;
			nod = stv[top];
			
			if(viz[ A[nod][i] ])
				continue;
			viz[ A[nod][i] ] = true;
			
			if(nod == X[ A[nod][i] ])
				stv[++top] = Y[ A[nod][i] ];
			else
				stv[++top] = X[ A[nod][i] ];
			nr[top] = 0;
		}	
		
		Q[++last] = nod;
		nod = stv[--top];
	}	
}

II void print()
{
	if(--last < M)
	{
		printf("-1\n");
		return;
	}
	FOR(i,1,last)
		printf("%d ",Q[i]);
}

int main()
{
	scan();
	euler();
	print();
	return 0;
}