Pagini recente » Borderou de evaluare (job #2024503) | Cod sursa (job #2211194) | Cod sursa (job #1494383) | Cod sursa (job #551588) | Cod sursa (job #640251)
Cod sursa(job #640251)
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int N,M,cnt,poz;
typedef pair <int,int> hh;
vector <bool> fol(500010,false);
vector <hh> nr[100010];
vector <bool> viz(100100,false);
queue <int> Q;
stack <int> S;
unsigned int s[100100];
void df(){/*
if(viz[x])
return;
viz[x]=1;
--cnt;
for(int i=0;i<s[x];++i)
df(nr[x][i].fs);*/
int x;
viz[1]=true;
S.push(1);
while(!S.empty()){
x=S.top();
while(s[x]<nr[x].size()){
if(viz[nr[x][s[x]].first])
++s[x];
else
break;
}
if(s[x]==nr[x].size()){
--cnt;
S.pop();
continue;
}
S.push(nr[x][s[x]].first);
viz[nr[x][s[x]].first]=true;
++s[x];
}
}
void euler(){/*
for(int i=0;i<s[x];++i){
if(!fol[ nr[x][i].sc ]){
fol[ nr[x][i].sc ]=1;
euler(nr[x][i].fs);
}
}*/
int x;
S.push(1);
while(!S.empty()){
x=S.top();
while(s[x]<nr[x].size()){
if(fol[ nr[x][s[x]].second ])
++s[x];
else
break;
}
if(s[x]==nr[x].size()){
Q.push(x);
S.pop();
continue;
}
fol[ nr[x][s[x]].second ]=1;
S.push(nr[x][s[x]].first);
++s[x];
}
}
int main(){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
int i,x,y;
scanf("%d%d",&N,&M);
for(i=1;i<=M;++i){
scanf("%d%d",&x,&y);
nr[x].push_back( hh(y,i) );
nr[y].push_back( hh(x,i) );
}
for(i=1;i<=N;++i){
if(nr[i].size()%2){
printf("-1\n");
fclose(stdin);
fclose(stdout);
return 0;
}
}
cnt=N;
df();
if(cnt){
printf("-1\n");
fclose(stdin);
fclose(stdout);
return 0;
}
for(i=0;i<=N;++i)
s[i]=0;
euler();
Q.pop();
for(;!Q.empty();Q.pop())
printf("%d ",Q.front());
printf("\n");
fclose(stdin);
fclose(stdout);
return 0;
}