Pagini recente » Cod sursa (job #324965) | Cod sursa (job #252921) | Cod sursa (job #2664234) | Cod sursa (job #3228953) | Cod sursa (job #1669903)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin ("ciclueuler.in");
ofstream cout("ciclueuler.out");
vector <int> G[100005], euler_cycle;
bool used[100005];
int n, m;
class Edge {
public:
int n1, n2;
};
Edge edge[1000005];
void Dfs(int node) {
used[node] = true;
for(auto nxt: G[node]) {
if(used[nxt]) {
continue;
}
Dfs(nxt);
}
}
inline bool EulerOK() {
Dfs(1);
for(int i = 1; i <= n; ++i) {
if(!used[i] or G[i].size() % 2 == 1) {
return 0;
}
}
return 1;
}
inline int NextEdge(int node) {
while(!G[node].empty() and used[G[node].back()]) {
G[node].pop_back();
}
if(!G[node].empty()) {
int new_edg = G[node].back();
G[node].pop_back();
used[new_edg] = true;
return edge[new_edg].n1 + edge[new_edg].n2 - node;
}
return 0;
}
inline void Euler(int node) {
//int nxt;
while(int nxt = NextEdge(node)) {
Euler(nxt);
}
euler_cycle.push_back(node);
}
int main() {
cin >> n >> m;
for(int i = 1; i <= m; ++i) {
int a, b;
cin >> a >> b;
edge[i] = {a, b};
G[a].push_back(i);
G[b].push_back(i);
}
if(!EulerOK()) {
cout << "-1\n";
return 0;
}
memset(used, 0, sizeof used);
Euler(1);
for(int i = 0; i <= (int) euler_cycle.size() - 2; ++i) {
cout << euler_cycle[i] << ' ';
}
cout << '\n';
return 0;
}