Cod sursa(job #391956)

Utilizator raduzerRadu Zernoveanu raduzer Data 6 februarie 2010 16:15:50
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

#define pb push_back
#define x first
#define y second
#define pii pair<int, int>
#define forit(it, v) for(; it != v.end(); ++it)

const int MAX_N = 100010;
const int MAX_M = 500010;

int n, m, r, z;
pii a[MAX_M];
int g[MAX_N], q[MAX_M], sol[MAX_M], f[MAX_M];
vector <int> v[MAX_N];
vector <int>::iterator it[MAX_N];

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

	scanf("%d %d", &n, &m);

	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d", &a[i].x, &a[i].y);

		v[a[i].x].pb(i);
		v[a[i].y].pb(i);

		++g[a[i].x];
		++g[a[i].y];
	}

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

	for (i = 1; i <= n; ++i)
		it[i] = v[i].begin();

	q[z = 1] = 1;

	while (z)
	{
		int nod = q[z];

		forit(it[nod], v[nod])
			if (!f[*(it[nod])])
				break;

		if (it[nod] != v[nod].end())
		{
			f[*(it[nod])] = 1;

			if (nod == a[*(it[nod])].x)
				q[++z] = a[*(it[nod])].y;
			else
				q[++z] = a[*(it[nod])].x;

			++it[nod];

			continue;
		}

		sol[++r] = q[z--];
	}

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

	for (i = 1; i < r; ++i)
		printf("%d ", sol[i]);
}