Pagini recente » Cod sursa (job #1852563) | Cod sursa (job #1835659) | Cod sursa (job #1275824) | Cod sursa (job #81396) | Cod sursa (job #2427818)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
const int dimN = 100001;
const int dimM = 500001;
int noduri, muchii;
stack<int>st;
bool sters[dimM];
int grade[dimN];
vector<int>ciclu;
struct muchie {
int nod, nrMuchie;
};
vector<muchie>G[dimN];
void citire() {
int c = 0;
in >> noduri >> muchii;
for (int i = 0; i < muchii; i++) {
int x, y;
in >> x >> y;
grade[x]++;
grade[y]++;
c++;
muchie m;
m.nrMuchie = c;
m.nod = y;
G[x].push_back(m);
m.nod = x;
G[y].push_back(m);
}
return;
}
bool areEuler() {
for (int i = 1; i <= noduri; i++) {
if (grade[i] & 1) {
return false;
}
}
return true;
}
void cicluE(int nod) {
st.push(nod);
while (st.empty() == false) {
int nod = st.top();
if (G[nod].size()) {
int vecin = G[nod].back().nod;
int muchie = G[nod].back().nrMuchie;
G[nod].pop_back();
if (!sters[muchie]) {
sters[muchie] = 1;
st.push(vecin);
}
}
else {
ciclu.push_back(nod);
st.pop();
}
}
return;
}
int main() {
citire();
if (!areEuler()) {
out << "-1\n";
return 0;
}
cicluE(1);
int k = ciclu.size();
for (int i = 0; i < k - 1; i++) {
out << ciclu[i] << " ";
}
return 0;
}