Pagini recente » Cod sursa (job #1472701) | Diferente pentru implica-te/arhiva-educationala intre reviziile 47 si 46 | Cod sursa (job #2830209) | Cod sursa (job #214654) | Cod sursa (job #2374172)
#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);
}
void euleriterativ(vector<vector<int>> &g, vector<EDGE> &edge) {
stack<int> stk2;
stk2.push(1);
while(stk2.size()) {
int from = stk2.top();
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;
stk2.push(to);
}
} else {
stk.push(from);
stk2.pop();
}
}
}
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);
}
for(int i = 1; i <= n; i ++)
if(g[i].size() % 2) {
out << -1;
return 0;
}
euleriterativ(g, e);
while(stk.size() > 1) {
out << stk.top() << " ";
stk.pop();
}
return 0;
}