Pagini recente » Cod sursa (job #1692356) | Cod sursa (job #1692364) | Cod sursa (job #3130898) | Cod sursa (job #938861) | Cod sursa (job #1231491)
#include <cstdio>
#define n_max 1000010
#define m_max 5000012
#define stn stack_node
#include <vector>
#include <deque>
using namespace std;
struct stack_node{
int inf;
stack_node *next;
} *v;
int n,m,d[n_max];
vector <int> Gr[n_max],L;
deque <int> dq;
bool s[n_max];
void add_stn(int x){
stn *c=new stn;
c->inf=x;
c->next=v;
v=c;
}
void pop_stn(){
stn *c=v;
v=v->next;
delete c;
}
void read_gr(){
int x,y;
scanf("%d %d",&n,&m);
while(m--){
scanf("%d %d",&x,&y);
d[x]++;d[y]++;
Gr[x].push_back(y);
Gr[y].push_back(x);
}
}
bool eulerian(){
vector <int> :: iterator it;
int i;
dq.push_back(1);s[1]=1;
while(!dq.empty()){
i=dq.front();
for(it=Gr[i].begin();it!=Gr[i].end();++it)
if(!s[*it]){
s[*it]=1;
dq.push_back(*it);
}
dq.pop_front();
}
for(i=1;i<=n;i++)
if(s[i]||d[i]%2)return 0;
return 1;
}
void solve(){
if(!eulerian()){
printf("-1");
return;}
vector <int> :: iterator it;
int c=1,g;
do{
while(!Gr[c].empty()){
g=Gr[c].front();
add_stn(c);
d[c]--;d[g]--;
Gr[c].erase(Gr[c].begin());
for(it = Gr[g].begin();it != Gr[g].end(); ++ it)
if(*it == c){
Gr[g].erase(it);
break;
}
c=g;
}
c=v->inf;
pop_stn();
L.push_back(c);
}while(v);
for(it = L.begin();it != L.end(); ++ it)
printf("%d ", *it );
}
int main(void){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
read_gr();
solve();
}