Pagini recente » Cod sursa (job #2839181) | Cod sursa (job #1229290) | Cod sursa (job #825554) | Cod sursa (job #1363448) | Cod sursa (job #2723329)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
const int NMax = 1e5, MMax = 5 * 1e5;
vector <int> g[NMax + 5], answer;
stack <int> st;
int n, m;
int from[MMax + 5], to[MMax + 5];
bool usenode[NMax + 5], useedge[MMax + 5];
void Read(){
fin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y;
fin >> x >> y;
g[x].push_back(i);
g[y].push_back(i);
from[i] = x;
to[i] = y;
}
}
void DFS(int node){
usenode[node] = 1;
for (auto edge : g[node]){
int ngh = from[edge] ^ to[edge] ^ node;
if (!usenode[ngh])
DFS(ngh);
}
}
int Check(){
DFS(1);
for (int i = 1; i <= n; i++)
if (g[i].size() % 2 || (g[i].size() && !usenode[i]))
return 0;
return 1;
}
void Cycle(int node){
while (!g[node].empty()){
int edge = g[node].back();
g[node].pop_back();
if (useedge[edge])
continue;
useedge[edge] = 1;
st.push(node);
node = from[edge] ^ to[edge] ^ node;
}
}
void Solve(){
int node = 1;
do {
Cycle(node);
node = st.top();
st.pop();
answer.push_back(node);
} while (!st.empty());
}
void Print(){
for (auto node : answer)
fout << node << ' ';
fout << '\n';
}
int main(){
Read();
if (!Check())
fout << -1 << '\n';
else{
Solve();
Print();
}
return 0;
}