Pagini recente » Cod sursa (job #1343167) | Cod sursa (job #2363294) | Cod sursa (job #715222) | Cod sursa (job #1389469) | Cod sursa (job #544604)
Cod sursa(job #544604)
#include<stdio.h>
#define N 100005
struct Nod {
int x;
Nod *next;
};
int n, m;
int que[N];
int list[N];
int gr[N];
int stack[N];
int viz[N];
Nod* a[N];
void insert(Nod *&p, int q) {
Nod* t = new Nod();
t -> x = q;
t -> next = p;
p = t;
}
void find_tour(int s) {
int top = 1;
Nod *it;
stack[top] = s;
while (top > 0) {
it = a[stack[top]];
while (it != 0) {
if (it -> x != -1) {
int n = it -> x;
it -> x = -1;
for(Nod* it2 = a[n]; it2 != 0; it2 = it2 -> next)
if (it2 -> x == stack[top]) {it2 -> x = -1; break;}
stack[++top] = n;
it = a[stack[top]];
continue;
}
it = it -> next;
}
list[++list[0]] = stack[top];
top--;
}
}
int bf(int s) {
int st = 1, dr = 1;
que[1] = s;
viz[s] = 1;
while (st <= dr) {
for(Nod *it = a[que[st]]; it; it = it -> next)
if (!viz[it -> x]) {
que[++dr] = it -> x;
viz[it->x] = 1;
}
st++;
}
}
int este_conex() {
bf(1);
for(int i = 1; i <= n; i++)
if (viz[i] == 0) return 0;
return 1;
}
int grad_par() {
for(int i = 1; i <= n; i++)
if (gr[i] % 2 != 0) return 0;
return 1;
}
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 u,v;
scanf("%d %d",&u,&v);
gr[u]++;
gr[v]++;
insert(a[u], v);
insert(a[v], u);
}
if (este_conex() && grad_par()) {
find_tour(1);
for(int i = 1; i < list[0]; i++)
printf("%d ",list[i]);
printf("\n");
}
else
printf("-1\n");
return 0;
}