Pagini recente » Cod sursa (job #1935971) | Cod sursa (job #1941938) | Cod sursa (job #833437) | Cod sursa (job #2059387) | Cod sursa (job #369064)
Cod sursa(job #369064)
# include <cstdio>
# include <string>
# include <algorithm>
using namespace std;
# define FIN "ciclueuler.in"
# define FOUT "ciclueuler.out"
# define MAX_L 20
# define MAX_N 100005
# define MAX_M 500005
struct List
{
int inf, ind;
List *next;
} *p, *G[MAX_N];
int N, M, i, ct;
int dg[MAX_M];
char s[MAX_L];
int Sol[MAX_M];
int Stack[MAX_M];
void del_used_edge(List *&f)
{
List *q;
while (f)
{
if (!dg[f -> ind]) return;
q = f;
f = f -> next;
delete(q);
}
}
void euler()
{
List *q;
int Nod, vf, newNod;
Stack[vf = 1] = Nod = 1;
while (vf)
{
del_used_edge(G[Nod]);
if (G[Nod])
{
newNod = G[Nod] -> inf;
dg[G[Nod] -> ind] = 1;
Stack[++vf] = newNod;
q = G[Nod];
G[Nod] = G[Nod] -> next;
delete(q);
Nod = newNod;
} else
{
Nod = Stack[vf];
del_used_edge(G[Nod]);
if (!G[Nod])
{
--vf;
Sol[++ct] = Nod;
}
}
}
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d%d\n", &N, &M);
int a, b, j;
for (i = 1; i <= M; ++i)
{
a = b = 0;
fgets(s + 1, MAX_L, stdin);
for (j = 1; s[j] != ' '; ++j) a = a * 10 + s[j] - '0';
for (++j; s[j] != '\n'; ++j) b = b * 10 + s[j] - '0';
++dg[a]; ++dg[b];
p = new List;
p -> inf = b; p -> ind = i; p -> next = G[a]; G[a] = p;
p = new List;
p -> inf = a; p -> ind = i; p -> next = G[b]; G[b] = p;
}
for (i = 1; i <= N; ++i)
if ((dg[i] & 1)) { printf("-1"); return 0; }
memset(dg, 0, sizeof(dg));
euler();
memset(dg, 0, sizeof(dg));
for (i = 1; i <= ct; ++i) dg[Sol[i]] = 1;
for (i = 1; i <= N; ++i)
if (!dg[i]) { printf("-1"); return 0; }
for (i = 1; i < ct; ++i) printf("%d ", Sol[i]);
return 0;
}