Pagini recente » Cod sursa (job #2593747) | Cod sursa (job #1926683) | Cod sursa (job #2922193) | Cod sursa (job #698496) | Cod sursa (job #1328300)
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <bitset>
#include <queue>
#include <algorithm>
#define NMAX 100005
using namespace std;
vector<int> v[NMAX];
stack<int> s;
int viz[NMAX], sol[NMAX];
int n, m;
queue<int> q;
void read()
{
int x, y;
scanf("%d %d", &n, &m);
for (int i=1; i<=m; i++){
scanf("%d %d", &x, &y);
v[x].push_back(y);
v[y].push_back(x);
}
}
void bfs()
{
viz[1] = 1;
q.push(1);
int x;
while (!q.empty()){
x = q.front();
q.pop();
for (vector<int>::iterator it = v[x].begin(); it != v[x].end(); ++it)
if (!viz[*it]){
viz[*it] = 1;
q.push(*it);
}
}
}
int conex()
{
bfs();
for (int i=1; i<=n; i++)
if (!viz[i])
return 0;
return 1;
}
int gradImpar()
{
for (int i=1; i<=n; i++)
if (v[i].size()%2 != 0)
return 1;
return 0;
}
void ciclueuler()
{
s.push(1);
int x, y;
while (!s.empty()){
x = s.top();
if (v[x].size() == 0){
sol[++sol[0]] = x;
s.pop();
}
else{
y = v[x][v[x].size()-1];
s.push(y);
v[x].pop_back();
for (int j = 0; j < v[y].size(); j++)
if (v[y][j] == x)
{
v[y].erase(v[y].begin() + j);
break;
}
}
}
for (int i=1; i<=sol[0]; ++i){
printf("%d ", sol[i]);
}
}
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
read();
if (!conex() || gradImpar()){
printf("-1\n");
return 0;
}
ciclueuler();
return 0;
}