Pagini recente » Cod sursa (job #457274) | Cod sursa (job #475388) | Cod sursa (job #2517662) | Cod sursa (job #1876982) | Cod sursa (job #954365)
Cod sursa(job #954365)
#include <cstdio>
#include <queue>
#include <list>
#include <stack>
#include <vector>
using namespace std;
const long N = 100006;
long n, m, size[N];
bool used [N];
list <long> v [N];
queue <long> q;
stack <long> st;
vector <long> sol;
void read (){
long i, x, y;
scanf ("%ld%ld", &n, &m);
for (i = 0; i < m; i ++){
scanf ("%ld%ld", &x, &y);
v [x].push_back(y);
v [y].push_back(x);
size [x] ++;
size [y] ++;
}
}
bool conex (){
long temp, i;
list <long> :: iterator it;
q.push(1);
used [1] = true;
while (!q.empty()){
temp = q.front();
for (it = v [temp].begin(); it != v [temp].end(); ++ it)
if (!used [*it]){
used [*it] = true;
q.push(*it);
}
q.pop();
}
for (i = 1; i <= n; i ++)
if (used [i] == false)
return 0;
return 1;
}
bool Euler (){
long i;
if (conex() == 0)
return 0;
for (i = 1; i <= n; i ++)
if (v [i].size() % 2)
return 0;
return 1;
}
void solve (){
long temp, x, y, i;
list <long> :: iterator it;
if (Euler() == 0)
printf ("-1\n");
else {
// nod de start = nod 1
x = 1;
do{
while (!v[x].empty()){
st.push(x);
y = v [x].front();
//stergere din x
v [x].pop_front();
size [x] --;
//stergere din y
for (it = v [y].begin(); it != v [y].end(); ++ it)
if (*it == x){
v [y].erase(it);
size [y] --;
break;
}
x = y;
}
sol.push_back(st.top());
x = st.top();
st.pop();
}while (!st.empty());
printf ("1 ");
for (vector <long> :: iterator it = sol.begin(); it != sol.end(); ++ it)
printf ("%ld ", (*it));
}
}
int main () {
list <long> :: iterator it;
freopen ("ciclueuler.in", "r", stdin);
freopen ("ciclueuler.out", "w", stdout);
read ();
solve ();
return 0;
}