Pagini recente » Cod sursa (job #2098792) | Cod sursa (job #3220372) | Cod sursa (job #415919) | Cod sursa (job #951825) | Cod sursa (job #2399546)
#include <fstream>
#include <vector>
#include <stack>
#include <tuple>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
using VI = vector<int>;
using VT = vector<tuple<int, int>>;
using VVT = vector<VT>;
using IT = vector<VT::iterator>;
using VB = vector<bool>;
VVT G;
VI c;
int n, m;
void citesteGraf();
void detCiclu(int x);
bool esteEulerian();
int main()
{
citesteGraf();
if ( !esteEulerian() ) {
fout << -1;
} else {
detCiclu(1);
for (size_t i = 0; i < c.size() - 1; ++i)
fout << c[i] << ' ';
}
}
void detCiclu(int x)
{
VB v = VB(m + 1);
IT p = IT(n + 1);
for (int i = 1; i <= n; ++i)
p[i] = G[i].begin();
stack<int> stk;
stk.push(x);
while (!stk.empty()) {
x = stk.top();
if (p[x] == G[x].end()) {
stk.pop();
c.emplace_back(x);
}
else {
while ( p[x] != G[x].end() ) {
auto [y, e] = *p[x];
p[x]++;
if (v[e]) continue;
v[e] = true;
stk.push(y);
break;
}
}
}
}
bool esteEulerian() {
for (auto ms : G)
if (ms.size() & 1)
return false;
return true;
}
void citesteGraf()
{
fin >> n >> m;
G = VVT(n + 1);
for (int i = 1, x, y; i <= m; ++i) {
fin >> x >> y;
G[x].emplace_back(y, i);
G[y].emplace_back(x, i);
}
}