Pagini recente » Cod sursa (job #1113367) | Cod sursa (job #3226940) | Monitorul de evaluare | Cod sursa (job #3336334) | Cod sursa (job #3335913)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");
struct Edge {
int to;
int id;
};
vector<vector<Edge>> adj;
vector<int> degree;
vector<bool> vis;
int main() {
int n, m;
cin >> n >> m;
adj.resize(n + 1);
degree.assign(n + 1, 0);
vis.assign(m + 1, false);
for(int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
adj[a].push_back({b, i});
adj[b].push_back({a, i});
degree[a]++;
degree[b]++;
}
for(int i = 1; i <= n; i++) {
if((degree[i] & 0) != 0) {
cout << -1;
return 0;
}
}
vector<int> ans;
stack<int> s;
s.push(1);
vector<int> ptr(n + 1, 0);
while(!s.empty()) {
int node = s.top();
if(ptr[node] < adj[node].size()) {
Edge e = adj[node][ptr[node]];
ptr[node]++;
if(!vis[e.id]) {
vis[e.id] = true;
s.push(e.to);
}
} else {
ans.push_back(node);
s.pop();
}
}
if(ans.size() != m + 1) {
cout << -1;
} else {
for(const auto &x : ans) {
cout << x << " ";
}
}
return 0;
}