Pagini recente » Cod sursa (job #2969585) | Cod sursa (job #2836166) | Cod sursa (job #299306) | Cod sursa (job #685743) | Cod sursa (job #1344653)
#include <fstream>
#include <stack>
#include <queue>
#include <list>
#include <typeinfo>
#define nmax 100010
#define pb push_back
#define pr(l,it) for(auto it=l.begin();it!=l.end();it++)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
int n,m;
list<int> G[nmax],p;
stack<int> st;
int deg[nmax];
bool viz[nmax];
void citire(){
in >> n >> m;
int u,v;
while(m--){
in >> u >> v;
deg[u]++;
deg[v]++;
G[v].pb(u);
G[u].pb(v);
}
}
void bfs(int i){
queue<int> Q;
Q.push(i);
while(!Q.empty()){
int cr=Q.front();
Q.pop();
pr(G[cr],it){
if(!viz[*it])
viz[*it]=true, Q.push(*it);
}
}
}
bool conex(){
bfs(1);
FOR(i,2,n) if(!viz[i]) return false;
return true;
}
bool eulerian(){
if(!conex()) return false;
FOR(i,1,n) if(deg[i]%2!=0) return false;
return true;
}
void sterge(int v,int w){
G[v].pop_front();
pr(G[w],it) if(*it==v) {G[w].erase(it); break;}
}
void euler(int v){
int w;
while(true){
if(G[v].empty())
break;
w=G[v].front();
sterge(v,w);
st.push(v);
v=w;
}
}
void res(){
int v=1;
do{
euler(v);
v=st.top(); st.pop();
p.pb(v);
}while(!st.empty());
}
int main(){
citire();
if(!eulerian()) {
out<<-1<<"\n";
return 0;
}
else res();
for(list<int>::reverse_iterator it=p.rbegin();it!=p.rend();it++){
out<<*it<<" ";
}
return 0;
}