Pagini recente » Cod sursa (job #116612) | Cod sursa (job #901970) | Cod sursa (job #199911) | Cod sursa (job #2590838) | Cod sursa (job #1441130)
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <list>
using namespace std;
#define MAXN 100010
int N, M;
vector<int> G[MAXN];
int viz[MAXN];
list<int> c;
void bfs(int sursa) {
queue<int> Q;
Q.push(sursa);
viz[sursa] = 1;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
for (int v : G[u]) {
if (!viz[v]) {
Q.push(v);
viz[v] = 1;
}
}
}
}
void euler(int u) {
stack<int> S;
S.push(u);
while (!S.empty()) {
int u = S.top();
while (!G[u].empty()) {
int v = G[u].back();
// sterge muchia de la u la v
G[u].pop_back();
// sterge muchia de la v la u
for (auto it = G[v].begin(); it != G[v].end(); ++it) {
if (u == *it) {
G[v].erase(it);
break;
}
}
S.push(v);
u = v;
}
c.push_back(u);
S.pop();
}
}
int main()
{
iostream::sync_with_stdio(false);
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
cin >> N >> M;
int a, b;
for (int i = 1; i <= M; ++i) {
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
// ## verific daca multigraful este eulerian
// 1. verific daca gradul unui nod din multigraf este impar
for (int i = 1; i <= N; i++) {
if (G[i].size() % 2 == 1) {
cout << "-1";
return 0;
}
}
// 2.verific daca multigraful nu este conex
bfs(1);
for (int i = 2; i <= N; ++i) {
if (viz[i] == 0) {
cout << "-1";
return 0;
}
}
euler(1);
for (int x : c) {
cout << x << " ";
}
return 0;
}