Pagini recente » Cod sursa (job #630410) | Cod sursa (job #2094040) | Cod sursa (job #2980267) | Cod sursa (job #1597125) | Cod sursa (job #1263773)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
struct Edge {
int a, b;
};
vector<vector<int>> G;
vector<int> p, D, cycle;
int n, m;
vector<Edge> E;
vector<bool> sel;
stack<int> st;
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
int a, b;
scanf("%d %d", &n, &m);
G.resize(n + 1);
E.resize(m + 1); p = D = vector<int>(n + 2);
sel.resize(n + 1);
for (int i = 1; i <= m; ++i)
{
scanf("%d %d", &a, &b);
E[i].a = a, E[i].b = b;
G[a].push_back(i);
G[b].push_back(i);
++D[a]; ++D[b];
}
for (int i = 1; i <= n; ++i)
if (D[i] % 2 == 1)
{
printf("-1\n");
return 0;
}
int e, x;
st.push(1);
while ( !st.empty() )
{
x = st.top();
if (p[x] < int(G[x].size()))
{
for (; p[x] < int(G[x].size()); ++p[x])
{
e = G[x][p[x]];
if (sel[e]) continue;
if (E[e].a == x)
st.push(E[e].b);
else
st.push(E[e].a);
sel[e] = true;
++p[x];
break;
}
}
else
{
cycle.push_back(x);
st.pop();
}
}
if (cycle.size() != m + 1)
{
printf("-1\n");
return 0;
}
for (size_t i = cycle.size() - 1; i >= 1; --i)
printf("%d ", cycle[i]);
printf("\n");
}