Pagini recente » Cod sursa (job #509453) | Cod sursa (job #2759862) | Cod sursa (job #2698663) | Cod sursa (job #3231475) | Cod sursa (job #1897453)
#include <stdio.h>
#define MAX_N 100000
#define MAX_M 500000
#define NIL -1
typedef struct {
int v, next;
} list;
int N, M, buff;
int adj[MAX_N + 1];
list l[2 * MAX_M + 1];
int stack[MAX_N + 1];
int inside[MAX_N + 1];
void addEdge(int u, int v) {
buff++;
inside[u]++;
l[buff].v = v;
l[buff].next = adj[u];
adj[u] = buff;
}
int check(int pos, int u) {
if (l[pos - 1].v == u) {
return pos - 1;
}
return pos + 1;
}
void euler(int u) {
int ss = 0, pos;
stack[ss++] = u;
while (ss) {
u = stack[ss - 1];
if (inside[u] == 0) {
ss--;
if (ss) {
fprintf(stdout, "%d ", u);
}
} else {
pos = adj[u];
adj[u] = l[pos].next;
if (l[pos].v != NIL) {
if (u > l[pos].v) {
inside[l[pos + 1].v]--;
l[pos + 1].v = NIL;
} else {
inside[l[pos - 1].v]--;
l[pos - 1].v = NIL;
}
stack[ss++] = l[pos].v;
l[pos].v = NIL;
inside[u]--;
}
}
}
}
int main(void) {
int i, u, v;
FILE *f = fopen("ciclueuler.in", "r");
fscanf(f, "%d %d", &N, &M);
for (i = 1; i <= M; i++) {
fscanf(f, "%d %d", &u, &v);
if (u > v) {
addEdge(u, v);
addEdge(v, u);
} else {
addEdge(v, u);
addEdge(u, v);
}
}
fclose(f);
u = 1;
while (u <= N && inside[u] % 2 == 0) {
u++;
}
freopen("ciclueuler.out", "w", stdout);
if (u <= N) {
fprintf(stdout, "%d\n", NIL);
} else {
euler(1);
}
fclose(stdout);
return 0;
}