Pagini recente » Cod sursa (job #2734126) | Cod sursa (job #3186326) | Cod sursa (job #832937) | Cod sursa (job #854371) | Cod sursa (job #2942150)
// Incercare: punem nodul in ciclu cand ajungem prima data la el.
#include <fstream>
#include <stack>
#include <vector>
using namespace std;
const int NMAX = 100005, MMAX = 500005;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n, nm, i, j, mc, nu, m;
vector<int> vm[NMAX], e;
int s[MMAX], d[MMAX];
bool u[MMAX];
stack<int> st;
bool eulerian () {
bool e = true;
for (int i = 1; i <= n; i++)
if (vm[i].size() & 1 == 1)
e = false;
return e;
}
int main() {
fin >> n >> m;
for (int im = 1; im <= m; im++) {
fin >> i >> j;
s[im] = i; // sursa
d[im] = j; // destinatia
u[im] = false; // Muchia nu este utilizata.
vm[i].push_back(im); // muchie incidenta cu i
vm[j].push_back(im);
}
if (not eulerian()) {
fout << -1;
}
else {
st.push(1);
e.push_back(1); // Punem in ciclul eulerian.
while (not st.empty()) {
int nod = st.top();
if (not vm[nod].empty()) {
mc = vm[nod].back(); // muchia curenta
vm[nod].pop_back();
if (not u[mc]) {
u[mc] = true; // muchie utilizata
nu = d[mc]; // nodul urmator
if (nu == nod)
nu = s[mc];
st.push(nu);
e.push_back(nu); // Punem in ciclul eulerian.
}
}
else
st.pop();
}
for (auto nod : e)
fout << nod << " ";
}
return 0;
}
// 1 2 6
// 1 6 4 3 7 5 3 6 2 1
// 1 6 2 1
// 4 3 6
// 7 5 3