Pagini recente » Cod sursa (job #1315019) | Cod sursa (job #3157831) | Cod sursa (job #87089) | Rating Pierre Gedit Felix (tamise) | Cod sursa (job #1370631)
#include<cstdio>
#include<vector>
#include<stack>
#include<cstring>
using namespace std;
const int N=100000;
class Node{
public:
int v;
Node*next;
Node*prec;
Node*p;
Node(){
next=p=prec=NULL;
}
};
Node g[N+1];
Node*last[N+1];
void add_edge(int x,int y){
Node *node=last[x];
node->next=new Node;
last[x]=node->next;
last[x]->prec=node;
last[x]->v=y;
}
stack<int>st;
int grad[N+1];
int n,m;
bool f;
void euler(int node){
st.push(node);
while(!st.empty()){
int dad=st.top();
Node* son=g[dad].next;
if(son==NULL){
if(f)
printf("%d ",dad);
st.pop();
f=true;
}
else{
Node*node=son->p;
if(node->next!=NULL)
node->next->prec=node->prec;
node->prec->next=node->next;
if(son->next!=NULL)
son->next->prec=son->prec;
son->prec->next=son->next;
st.push(son->v);
}
}
}
int main(){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
last[i]=&g[i];
g[i].v=i;
}
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add_edge(x,y);
add_edge(y,x);
grad[x]++;
grad[y]++;
if(x!=y){
Node*node=last[x];
node->p=new Node;
node->p=last[y];
node=last[y];
node->p=new Node;
node->p=last[x];
}
else{
Node*node=last[x];
node->p=new Node;
node->p=last[y]->prec;
node=last[y]->prec;
node->p=new Node;
node->p=last[x];
}
}
for(int i=1;i<=n;i++)
if(grad[i]%2!=0){
printf("-1");
return 0;
}
for(int i=1;i<=n;i++)
if(grad[i]!=0){
euler(i);
break;
}
return 0;
}