Pagini recente » Cod sursa (job #1851803) | Cod sursa (job #2241902) | Cod sursa (job #412387) | Cod sursa (job #316236) | Cod sursa (job #954361)
Cod sursa(job #954361)
#include <cstdio>
#include <queue>
#include <list>
#include <stack>
using namespace std;
const long N = 100006;
long n, m, sol [N], size[N];
bool used [N];
list <long> v [N];
queue <long> q;
stack <long> st;
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 (size [x]){
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 [++ sol [0]] = st.top();
x = st.top();
st.pop();
}while (!st.empty());
printf ("1 ");
for (i = 1; i <= sol [0]; i ++)
printf ("%ld ", sol [i]);
}
}
int main () {
freopen ("ciclueuler.in", "r", stdin);
freopen ("ciclueuler.out", "w", stdout);
read ();
solve ();
return 0;
}