Pagini recente » Cod sursa (job #2451393) | Cod sursa (job #2938965) | Cod sursa (job #1157738) | Cod sursa (job #3190530) | Cod sursa (job #1070323)
#include <stdio.h>
#include <list>
#include<vector>
#include <stack>
#define pb push_back
#include <queue>
#define TR( C, it ) \
for( list<int>::iterator it = C.begin(); it != C.end(); it++ )
using namespace std;
const int nmax = 108000;
list <int> a[nmax],sol;
//vector <int> sol;
stack <int> C;
queue <int> Q;
int n,m,parc[nmax], nr[nmax];
void dfs(){
// parc[nod]=1;
//for(int i=0;i<a[nod].size();i++)
int it,nod;
Q.push(1);
// for( typeof(a[nod].begin()) it = a[nod].begin(); it != a[nod].end(); it++ )
while(!Q.empty()){
nod = Q.front();Q.pop();
parc[nod]=1;
TR(a[nod],it)
if(parc[*it]!=1)Q.push(*it);
}
//dfs(*it);
}
int eulerian(){
dfs();
for(int i=1;i<=n;i++)
{
// if( parc[i]!=1) return 0;
if(nr[i]%2==1)return 0;
}
for(int i=1;i<=n;i++)
{
if( parc[i]!=1) return 0;
// if(a[i].size()%2==1)return 0;
}
return 1;
}
void parcurgere(int nod){
//for( typeof(a[nod].begin()) it = a[nod].begin(); it != a[nod].end(); it++ ){
//while(!a[nod].empty()){
while(true){
if(a[nod].empty())break;
int it1 = a[nod].front();
C.push(nod);
a[nod].pop_front();
TR(a[it1],ib)
if(*ib==nod){
a[it1].erase(ib); break;
}
nod=it1;
}
//}
// }
}
void rez(){
if(eulerian()){
// C.push(1);
int w=1;
do{
parcurgere(w);
w = C.top();
C.pop();
// if(!a[w].empty()){
sol.pb(w);
}while(!C.empty());
}else sol.pb(-1);
}
void cit(){
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
a[x].pb(y);nr[x]++;nr[y]++;
//if(y!=x)
a[y].pb(x);
}
}
void scr(){
int it;
TR(sol,it)
printf("%d ", *it);
}
int main(){
cit();
rez();
//for(int i=0;i<sol.size();i++)
scr();
fclose(stdout); fclose(stdin);
return 0;
}