Cod sursa(job #245431)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 17 ianuarie 2009 23:11:47
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <assert.h>
#include <vector>

using namespace std;

#define maxn 100010
#define maxx 500010

int N, M, L, NR;
vector <int> A[maxn];
int G[maxn], w[maxn];
int X[maxx], Y[maxx];
int S[maxx], Rez[maxx];
char U[maxx];

int main()
{
	freopen("ciclueuler.in", "r", stdin);
	freopen("ciclueuler.out", "w", stdout);

	int i, nod;

	scanf("%d %d ", &N, &M);

	assert(1 <= N && N <= 100000);
	assert(1 <= M && M <= 500000);

	for (i = 1; i <= M; i++)
	{
		scanf("%d %d ", &X[i], &Y[i]);

		assert(1 <= X[i] && X[i] <= N);
		assert(1 <= Y[i] && Y[i] <= N);

		A[X[i]].push_back(i);
		A[Y[i]].push_back(i);
	}

	for (i = 1; i <= N; i++) G[i] = A[i].size();

	for (i = 1; i <= N; i++)
		if (G[i]&1)
		{
			printf("-1\n");
			return 0;
		}

	L = 1;
	S[L] = 1;

	while (L > 0)
	{
		nod = S[L];
		for (; w[nod]<G[nod] && U[A[nod][w[nod]]]; w[nod]++);

		if (w[nod] < G[nod])
		{
			U[A[nod][w[nod]]] = 1;
			if (nod == X[A[nod][w[nod]]]) S[++L] = Y[A[nod][w[nod]]];
			else S[++L] = X[A[nod][w[nod]]];
			w[nod]++;
			continue;
		}

		Rez[++NR] = S[L--];
	}

	if (NR <= M)
	{
		printf("-1\n");
		return 0;
	}

	for (i = 1; i < NR; i++) printf("%d ", Rez[i]);
	printf("\n");

	return 0;
}