Pagini recente » Cod sursa (job #258540) | Cod sursa (job #623714) | Borderou de evaluare (job #1036300) | Cod sursa (job #1489413) | Cod sursa (job #1245181)
#include <stdio.h>
#include <list>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#define Nmax 100005
vector<list<int>> Graph;
list<int> sol;
stack<int> s;
int deg[Nmax];
int visited[Nmax];
int n, m;
void read(){
int u, v;
scanf("%d %d", &n, &m);
Graph.resize(n + 1);
while (m--){
scanf("%d %d", &u, &v);
Graph[u].push_back(v);
Graph[v].push_back(u);
++deg[u];
++deg[v];
}
}
void bfs(int v){
queue<int> q;
q.push(v);
visited[v] = 1;
while (!q.empty()){
v = q.front();
q.pop();
for (list<int>::iterator it = Graph[v].begin(); it != Graph[v].end(); ++it)
if (!visited[*it]){
q.push(*it);
visited[*it] = 1;
}
}
}
void delete_edge(int u, int v){
Graph[u].pop_front();
for (list<int>::iterator it = Graph[v].begin(); it != Graph[v].end(); ++it)
if (*it == u){
Graph[v].erase(it);
break;
}
}
int is_euler(){
int v, u;
bfs(1);
for (int i = 1; i <= n; ++i)
if (!visited[i] || deg[i] % 2 == 1)
return 0;
s.push(1);
while (!s.empty()){
v = s.top();
while (!Graph[v].empty()){
u = Graph[v].front();
s.push(u);
delete_edge(v, u);
v = u;
}
v = s.top();
s.pop();
sol.push_back(v);
}
return 1;
}
int main(){
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
read();
if ( is_euler() ){
sol.pop_back();
for (list<int>::iterator it = sol.begin(); it != sol.end(); ++it)
printf("%d ", *it);
}
else
printf("-1\n");
return 0;
}