Pagini recente » Cod sursa (job #427375) | Cod sursa (job #2464737) | Cod sursa (job #1856688) | Cod sursa (job #374393) | Cod sursa (job #288863)
Cod sursa(job #288863)
#include <stdio.h>
#include <list>
#include <stack>
#include <queue>
using namespace std;
#define TR(C, it) for (typeof(C.begin())it=C.begin(); it!=C.end(); it++)
#define pb push_back
#define dim 100100
list<int> g[dim], l;
stack<int> s;
queue<int> q;
int n, m, gr[dim], fol[dim];
void bfs(int v)
{
q.push(v);
fol[v]=1;
while (!q.empty())
{
v=q.front();
q.pop();
TR(g[v], w)
if (!fol[*w])
{
q.push(*w);
fol[*w]=1;
}
}
}
int conex()
{
int i;
bfs(1);
for (i=2; i<=n; i++)
if (!fol[i]) return 0;
return 1;
}
void sterge(int v, int w)
{
gr[v]--, gr[w]--;
g[v].pop_front();
TR(g[w], it)
if (*it==v)
{
g[w].erase(it);
break;
}
}
void euler(int v)
{
while (1)
{
if (g[v].empty()) break;
int w=g[v].front();
s.push(v);
sterge(v, w);
v=w;
}
}
void construire()
{
int v=1;
do
{
euler(v);
v=s.top();
s.pop();
l.pb(v);
} while (!s.empty());
}
int eulerian()
{
int i;
for (i=1; i<=n; i++)
if (gr[i]%2 || !gr[i]) return 0;
if (!conex()) return 0;
construire();
return 1;
}
int main()
{
int a, b, i;
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (i=1; i<=m; i++)
{
scanf("%d %d\n", &a, &b);
gr[a]++, gr[b]++;
g[a].pb(b);
g[b].pb(a);
}
if (eulerian()) TR(l, v) printf("%d ", *v);
else printf("-1\n");
return 0;
}