Pagini recente » Cod sursa (job #2990397) | Cod sursa (job #3244153) | Cod sursa (job #2279510) | Cod sursa (job #2237967) | Cod sursa (job #2174724)
#include <bits/stdc++.h>
#define pii pair <int, int>
#define f first
#define s second
#define mp make_pair
FILE *fin = freopen("ciclueuler.in", "r", stdin);
FILE *fout = freopen("ciclueuler.out", "w", stdout);
using namespace std;
const int Nmax = 1e5+5;
const int Mmax = 5e5+5;
/*------Data------*/
int n, m;
vector <pii> G[Nmax];
int deg[Nmax];
/*------Euler-----*/
bool ifCycle = true;
stack <int> st;
vector <int> cycle;
bitset <Mmax> seen;
void Read(){
int u, v;
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; ++ i){
scanf("%d%d", &u, &v);
G[u].push_back(mp(v, i));
G[v].push_back(mp(u, i));
deg[u]++; deg[v]++;
}
}
int Next(int node){
while(!G[node].empty() && seen.test(G[node].back().s))
G[node].pop_back();
pii nxt = G[node].back();
G[node].pop_back();
seen.set(nxt.s);
deg[node]--; deg[nxt.f]--;
return nxt.f;
}
void Euler(){
for(int i = 1; i <= n; ++ i)
if(deg[i] & 1){
ifCycle = false;
return;
}
int node = 1;
while(node <= n && !deg[node]) node++;
st.push(node);
while(!st.empty()){
node = st.top();
if(deg[node])
st.push(Next(node));
else{
cycle.push_back(node);
st.pop();
}
}
}
int main(){
Read();
Euler();
if(!ifCycle) printf("-1\n");
else
for(int i = 0; i < cycle.size()-1; ++ i){
printf("%d ", cycle[i]);
}
return 0;
}