Pagini recente » Cod sursa (job #1376159) | Cod sursa (job #1499981) | Cod sursa (job #2450107) | Cod sursa (job #127677) | Cod sursa (job #2416435)
#include <fstream>
#include <vector>
#include <stack>
#include <tuple>
using namespace std;
using VI = vector<int>;
using VT = vector<tuple<int, int>>;
using VVT = vector<VT>;
using VIT = vector<VT::iterator>;
using VB = vector<bool>;
int n, m;
VVT G;
VI c;
VB v;
stack<int> stk;
void Read();
bool Euler();
void Cycle(int x);
void Write();
int main()
{
Read();
Write();
}
void Write()
{
ofstream fout("ciclueuler.out");
if (!Euler())
fout << -1;
else
{
Cycle(1);
for (size_t i = 0; i < c.size() - 1; i++)
fout << c[i] << ' ';
}
}
void Cycle(int x)
{
v = VB(m + 1);
VIT p = VIT(n + 1);
for (int i = 1; i <= n; i++)
p[i] = G[i].begin();
stk.emplace(x);
int y, e;
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())
{
tie(y, e) = *p[x];
p[x]++;
if (v[e])
continue;
v[e] = true;
stk.emplace(y);
break;
}
}
}
bool Euler()
{
for (int x = 1; x <= n; x++)
if (G[x].size() & 1)
return false;
return true;
}
void Read()
{
ifstream fin("ciclueuler.in");
fin >> n >> m;
G = VVT(n + 1);
int x, y;
for (int i = 1; i <= m; i++)
{
fin >> x >> y;
G[x].emplace_back(y, i);
G[y].emplace_back(x, i);
}
}