Pagini recente » Cod sursa (job #80677) | Cod sursa (job #632576)
Cod sursa(job #632576)
#include <cstdio>
#define N 100003
using namespace std;
int n, m, viz[N], mic[N], mare[N], k, l;
struct nod
{
int x;
nod *urm;
} *a[N];
void add(nod *&p, int x)
{
nod *q = new nod;
q -> x = x;
q -> urm = p;
p = q;
}
void citire()
{
scanf ("%d %d ", &n, &m);
for (int i = 1; i <= m; ++ i)
{
int x, y;
scanf ("%d %d ", &x, &y);
if (x != y)
{
add (a[x], y);
add (a[y], x);
}
}
}
void afisare()
{
for (int i = 0; i < k - 1; ++ i)
printf ("%d ", mare[i]);
printf ("\n");
}
bool grade()
{
for (int i = 1; i <= n; ++ i)
{
int nr = 0;
for (nod *j = a[i]; j; ++nr, j = j -> urm);
if (nr % 2 != 0)
return 0;
}
return 1;
}
bool izolat(int i)
{
for (nod *j = a[i]; j; j = j -> urm)
if (j -> x > 0)
return 0;
return 1;
}
void euler(int i)
{
mic[l ++] = i;
for (nod *j = a[i]; j; j = j -> urm)
if (j -> x != 0)
{
int aux = j -> x;
j -> x = 0;
for (nod *z = a[aux]; z; z = z -> urm)
if (z -> x == i)
{
z -> x = 0;
break;
}
euler (aux);
}
}
void adauga(int x)
{
for (int i = 0; i < k; ++ i)
if (mare[i] == x)
{
for (int j = k - 1; j > i; -- j)
mare[j + l] = mare[j];
for (int j = i; j < i + l; ++ j)
mare[j] = mic[j - l];
return;
}
for (int i = 0; i < l; ++ i)
mare[i] = mic[i];
k = l;
}
void ciclu()
{
for (int i = 1; i <= n; ++ i)
if (!izolat (i))
{
euler (i);
adauga (i);
l = 0;
}
}
int main()
{
freopen ("ciclueuler.in", "r", stdin);
freopen ("ciclueuler.out", "w", stdout);
citire();
if (!grade())
printf ("-1\n");
else
{
ciclu();
afisare();
}
return 0;
}