Cod sursa(job #634357)

Utilizator sebii_cSebastian Claici sebii_c Data 16 noiembrie 2011 01:24:29
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <vector>

using namespace std;

#define NMAX 100010
#define MMAX 500010

int n, m, L, nr;
vector<int> A[NMAX];
int G[NMAX], w[NMAX];
int X[MMAX], Y[MMAX];
int S[MMAX], res[MMAX];
char vis[MMAX];

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

	int i, node;
	
	scanf("%d %d", &n, &m);
	for (i=1; i<=m; ++i) {
		scanf("%d %d", &X[i], &Y[i]);
		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) {
		node = S[L];
		for ( ; w[node] < G[node] && vis[A[node][w[node]]]; w[node]++);
		
		if (w[node] < G[node]) {
			vis[A[node][w[node]]] = 1;
			if (node == X[A[node][w[node]]])
				S[++L] = Y[A[node][w[node]]];
			else
				S[++L] = X[A[node][w[node]]];
			++w[node];
			continue;
		}
		res[++nr] = S[L--];
	}	
	
	if (nr <= m) {
		printf("-1\n");
		return 0;
	}
	
	for (i=1; i<nr; ++i)
		printf("%d ", res[i]);
	printf("\n");
	return 0;
}