Pagini recente » Cod sursa (job #353593) | Cod sursa (job #1472116) | Cod sursa (job #3170654) | Cod sursa (job #2946197) | Cod sursa (job #431965)
Cod sursa(job #431965)
#include <stdio.h>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#define pb push_back
#define Nmax 100005
using namespace std;
list< int > G[Nmax],Veu;
list< int >:: iterator it;
stack< int > S;
queue< int > Q;
int n,m,i,x,y;
int use[Nmax],grad[Nmax];
void bfs(){
int x;
Q.push(1); use[1]=1;
while( !Q.empty() ){
x=Q.front();
for(it=G[x].begin(); it!=G[x].end(); ++it)
if(!use[*it]){
use[*it]=1;
Q.push(*it);
}
Q.pop();
}
}
void sterge(int v,int w){
G[v].pop_front();
for(it=G[w].begin(); it!=G[w].end(); ++it)
if(*it==v){
G[w].erase(it);
break;
}
}
int work(){
int i,v,w;
bfs();
for(i=2;i<=n;++i)
if(!use[i]) return 0;
for(i=1;i<=n;++i)
if( grad[i] & 1 ) return 0;
v=1;
do{
while( !G[v].empty() ){
w=G[v].front();
S.push(v);
sterge(v,w);
v=w;
}
v=S.top(); S.pop();
Veu.pb(v);
} while( ! S.empty() );
return 1;
}
void scrie(){
for(it=Veu.begin(); it!=Veu.end(); ++it)
printf("%d ",*it);
printf("\n");
}
int main(){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i){
scanf("%d%d",&x,&y);
G[x].pb(y); grad[x]++;
G[y].pb(x); grad[y]++;
}
if( !work() ) printf("%d\n",-1);
else scrie();
fclose(stdin); fclose(stdout);
return 0;
}