Pagini recente » Cod sursa (job #1223670) | Cod sursa (job #2401434) | Statistici Liliana Ursache (lilianaursache) | Cod sursa (job #2195031) | Cod sursa (job #2374144)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <iomanip>
#define ll long long
#define lsb(x) (x & -x)
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
struct EDGE {
int from, to, del;
};
stack<int> stk;
void euler(int from, vector<vector<int>> &g, vector<EDGE> &edge) {
if(g[from].size()) {
int i = g[from].back();
g[from].pop_back();
if(edge[i].del == 0) {
edge[i].del = 1;
int to = edge[i].to;
if(to == from)
to = edge[i].from;
euler(to, g, edge);
}
euler(from, g, edge);
} else
stk.push(from);
}
int dfs(int node, vector<bool> &visited, const vector<vector<int>> &g, const vector<EDGE> &e) {
int nr = 1;
visited[node] = 1;
for(auto it : g[node]) {
int to = e[it].to;
if(to == node)
to = e[it].from;
if(!visited[to])
nr += dfs(to, visited, g, e);
}
return nr;
}
int main() {
int n, m;
in >> n >> m;
vector<EDGE> e(m + 1, {0, 0, 0});
vector<vector<int>> g(n + 1);
for(int i = 1; i <= m; i ++) {
in >> e[i].from >> e[i].to;
g[e[i].from].push_back(i);
g[e[i].to].push_back(i);
}
vector<bool> visited(n + 1, 0);
if(dfs(1, visited, g, e) != n) {
out << -1;
return 0;
}
for(int i = 1; i <= n; i ++)
if(g[i].size() % 2) {
out << -1;
return 0;
}
euler(1, g, e);
while(stk.size() > 1) {
out << stk.top() << " ";
stk.pop();
}
return 0;
}