Cod sursa(job #1545784)

Utilizator gabi.cristacheGabi Cristache gabi.cristache Data 7 decembrie 2015 01:56:57
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
// infoarenaDFSnonRec.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <stack>

#define MaxN 100005

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

int N, M;
list<int> G[MaxN];
list<int> result;
int degree[MaxN];
bool visited[MaxN];
stack<int> eulerianRoad;

void bfs(int src) {
	queue<int> visitedNodes;
	visited[src] = true;
	visitedNodes.push(src);

	while (!visitedNodes.empty()) {
		int crt = visitedNodes.front();
		visitedNodes.pop();

		for (list<int>::iterator it = G[crt].begin(); it != G[crt].end(); ++it) {
			if (!visited[*it]) {
				visited[*it] = true;
				visitedNodes.push(*it);
			}
		}
	}
}

void erase(int v, int w) {
	G[v].pop_front();
	for (list<int>::iterator it = G[w].begin(); it != G[w].end(); ++it) {
		if (*it == v) {
			G[w].erase(it);
			break;
		}
	}
}

void euler(int v) {
	while (true) {
		if (G[v].empty())
			break;

		eulerianRoad.push(v);
		int w = G[v].front();

		erase(v, w);

		v = w;
	}
}

int main() {
	fin >> N >> M;
	for (int i = 0; i < M; ++i) {
		int x, y;
		fin >> x >> y;
		degree[x]++;
		degree[y]++;
		G[x].push_back(y);
		G[y].push_back(x);
	}

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

	bfs(1);
	for (int i = 2; i <= N; ++i) {
		if (!visited[i]) {
			fout << "-1\n";
			return 0;
		}
	}

	int v = 1;
	do {
		euler(v);
		v = eulerianRoad.top();
		eulerianRoad.pop();
		result.push_back(v);
	} while (!eulerianRoad.empty());

	for (list<int>::iterator it = result.begin(); it != result.end(); ++it) {
		fout << *it << ' ';
	}
	fout << '\n';

	return 0;
}