Pagini recente » Cod sursa (job #2276470) | Cod sursa (job #1228313) | Cod sursa (job #1637772) | Cod sursa (job #1015753) | Cod sursa (job #1545784)
// 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;
}