Pagini recente » Profil M@2Te4i | Cod sursa (job #1296419) | Istoria paginii utilizator/ionutciobica | Cod sursa (job #1244331) | Cod sursa (job #1216868)
#include <cstdio>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 100005;
list <int> G[maxn], L;
list <int> :: iterator it;
queue <int> Q;
stack <int> S;
int N, M, grad[maxn];
bool used[maxn];
void BFS()
{
Q.push(1);
while (!Q.empty())
{
int node = Q.front();
Q.pop();
for (it = G[node].begin(); it != G[node].end(); ++it)
{
if (!used[*it])
{
Q.push(*it);
used[*it] = 1;
}
}
}
}
inline bool Check_Grade()
{
for (int i = 1; i <= N; ++i)
if (grad[i] % 2 == 1) return 0;
return 1;
}
inline bool Check_Conex()
{
BFS();
for (int i = 1; i <= N; ++i)
if (!used[i]) return 0;
return 1;
}
inline bool Eulerian()
{
if (Check_Conex() && Check_Grade()) return 1;
return 0;
}
inline void Delete(int v, int w)
{
--grad[v], --grad[w];
G[v].pop_front();
for (it = G[w].begin(); it != G[w].end(); ++it)
{
if (*it == v)
{
G[w].erase(it);
break;
}
}
}
void Euler(int v)
{
while (true)
{
if (G[v].empty()) break;
int w = G[v].front();
S.push(v);
Delete(v, w);
v = w;
}
}
void Solve()
{
int v = Eulerian();
if (v == 0)
{
printf("-1\n");
return;
}
do
{
Euler(v);
v = S.top(), S.pop();
L.push_back(v);
} while (!S.empty());
for (it = L.begin(); it != L.end(); ++it)
printf("%d ", *it);
printf("\n");
}
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= M; ++i)
{
int v, w;
scanf("%d %d", &v, &w);
G[v].push_back(w), ++grad[v];
G[w].push_back(v), ++grad[w];
}
Solve();
return 0;
}