Pagini recente » Cod sursa (job #843528) | Diferente pentru utilizator/robertkarol intre reviziile 21 si 22 | Rezultatele filtrării | Diferente pentru utilizator/parket intre reviziile 5 si 6 | Cod sursa (job #1245702)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
struct muchie{
long n1,n2;
bool used;
muchie operator()(long nn1,long nn2){
n1 = nn1; n2 = nn2;
used = false;
return *this;
}
}e;
#define maxN 100010
long n,m,i,x,y;
vector<muchie> G;
vector<long> list[maxN];
bool vis[maxN];
long neigh[maxN];
inline long getDir(long nod,long pos){
pos = list[nod][pos];
if(G[pos].n1 == nod) return G[pos].n2;
else return G[pos].n1;
}
void bfs(long nod){
queue<long> Q;
vis[nod] =true; Q.push(nod);
while(!Q.empty()){
nod = Q.front(); Q.pop();
for(long i=0;i<list[nod].size();i++){
long newNod = getDir(nod,i);
if(!vis[newNod]) {
vis[newNod] = true;
Q.push(newNod);
}
}
}
}
inline bool isEuler() {
for(i=1;i<=n;i++)
if((!vis[i]) || (neigh[i] % 2))
return false;
return true;
}
void Euler(long nod){
for(long i=0;i<list[nod].size();i++){
if(G[list[nod][i]].used) continue;
long newNod = getDir(nod,i);
G[list[nod][i]].used = true;
Euler(newNod);
}
if(nod > 1) printf("%ld ",nod);
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%ld %ld",&n,&m);
for(i=1;i<=m;i++){
scanf("%ld %ld",&x,&y);
G.push_back(e(x,y));
list[x].push_back(i-1); neigh[x]++;
list[y].push_back(i-1); neigh[y]++;
}
bfs(1);
if(!isEuler()){
printf("-1");
} else {
printf("1 ");
Euler(1);
}
return 0;
}