Cod sursa(job #1182214)

Utilizator ELHoriaHoria Cretescu ELHoria Data 5 mai 2014 02:19:35
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cassert>

using namespace std;
const int DIM = (1 << 17);
char buff[DIM];
int poz;

int readInt() {
	int ret = 0;
	while (buff[poz] < '0' || buff[poz] > '9')
	if (++poz == DIM) fread(buff, 1, DIM, stdin), poz = 0;
	while ('0' <= buff[poz] && buff[poz] <= '9') {
		ret = ret * 10 + buff[poz] - '0';
		if (++poz == DIM)
			fread(buff, 1, DIM, stdin), poz = 0;
	}

	return ret;
}
const int NMAX = 100010;
vector<int> G[NMAX];
int res[NMAX * 5];
int st[NMAX * 5];

void euler() {
	int n, m;
	int v, w;
	int Ls = 0;
	int top = 0;
	int i, j;
	int v1 = -1, v2 = -1;
	bool bad = false;
	v = 0;
	n = readInt();
	m = readInt();
	for (i = 0; i < m; i++) {
		v = readInt();
		w = readInt();
		v--, w--;
		//  assert(0 <= v && v < n && 0 <= w && w < n);
		G[v].push_back(w);
		G[w].push_back(v);
	}

	for (i = 0; i < n; ++i) {
		if (G[i].size() & 1) {
			if (v1 == -1)
				v1 = i;
			else if (v2 == -1)
				v2 = i;
			else {
				bad = true;
				break;
			}
		}
	}

	if (bad) {
		printf("-1\n");
		for (i = 0; i < n; i++) {
			G[i].clear();
		}

		return;
	}

	if (v1 != -1) {
		G[v1].push_back(v2);
		G[v2].push_back(v1);
	}

	st[top++] = v;
	while (top) {
		v = st[top - 1];
		if (G[v].empty()) {
			res[Ls++] = v;
			top--;
		} else {
			w = G[v].back();
			G[v].pop_back();
			*find(G[w].begin(), G[w].end(), v) = G[w].back();
			G[w].pop_back();
			st[top++] = w;
		}
	}


	for (i = 0; i < n; i++) {
		if (!G[i].empty()) {
			bad = 1;
			G[i].clear();
		}
	}

	if (bad) {
		printf("-1\n");
		return;
	}

	if (v1 != -1) {
		printf("-1\n");
		return;
		for (i = 0; i + 1 < Ls; ++i)
			if ((res[i] == v1 && res[i + 1] == v2) || (res[i] == v2 && res[i + 1] == v1)) {
				printf("DA\n");
				for (j = i + 1; j < Ls; ++j)
					printf("%d ", res[j] + 1);
				for (j = 1; j <= i; ++j)
					printf("%d ", res[j] + 1);

				printf("\n");
				return;
			}
	}

	if (bad)
		printf("-1\n");
	else {
		for (i = 0; i < Ls; ++i)
			printf("%d ", res[i] + 1);
		printf("\n");
	}
}

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

	euler();
	return 0;
}