Pagini recente » Cod sursa (job #3219347) | Cod sursa (job #2158092) | Cod sursa (job #1633361) | Cod sursa (job #2547842) | Cod sursa (job #1501602)
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
const int MAX_N = 100000;
int n, m;
bool U[1 + MAX_N];
int Deg[1 + MAX_N];
vector < int > A[1 + MAX_N];
vector < int > eCycle;
stack < int > S;
void dfs(int u) {
for(auto i : A[u]) {
if(U[i] == 0) {
U[i] = 1;
dfs(i);
}
}
}
void getEulerCycle() {
int u, i, v;
S.push(1);
while(!S.empty()) {
u = S.top();
if(A[u].empty() == 1) {
eCycle.push_back(u);
S.pop();
}
else {
v = A[u][A[u].size() - 1];
A[u].pop_back();
if(v != u) {
for(i = 0; A[v][i] != u; i++);
swap(A[v][i], A[v][A[v].size() - 1]);
A[v].pop_back();
}
S.push(v);
}
}
}
int main() {
int i, u, v;
bool isConnected = 1, evenDeg = 1;
in >> n >> m;
for(i = 1; i <= m; i++) {
in >> u >> v;
A[u].push_back(v);
if(u != v) {
A[v].push_back(u);
Deg[v]++;
Deg[u]++;
}
}
U[1] = 1;
dfs(1);
for(i = 1; i <= n && isConnected && evenDeg; i++) {
isConnected &= U[i];
evenDeg &= (Deg[i] % 2 == 0);
}
if(isConnected == 0 || evenDeg == 0) {
out << "-1\n";
return 0;
}
getEulerCycle();
eCycle.pop_back();
for(i = 0; i < eCycle.size(); i++)
out << eCycle[i] << " ";
out << "\n";
return 0;
}