#include <stdio.h>
#include <stdbool.h>
#define MAXV 10005
#define MAXE 200005
int head[MAXV];
int to[MAXE];
int next_edge[MAXE];
int edge_id[MAXE];
int edge_count = 0;
bool used_edge[MAXE / 2];
int degree[MAXV];
int circuit[MAXE];
int circuit_size = 0;
void add_edge(int u, int v, int id) {
to[edge_count] = v;
edge_id[edge_count] = id;
next_edge[edge_count] = head[u];
head[u] = edge_count++;
degree[u]++;
}
void find_circuit(int u) {
while (head[u] != -1) {
int i = head[u];
head[u] = next_edge[i];
int id = edge_id[i];
if (used_edge[id]) continue;
used_edge[id] = true;
find_circuit(to[i]);
}
circuit[circuit_size++] = u;
}
int main() {
int n, m;
printf("Nhap so dinh va so canh: "); if (scanf("%d %d", &n
, &m
) != 2) return 0;
for (int i = 0; i < n; i++) {
head[i] = -1;
degree[i] = 0;
}
printf("Nhap cac canh (u v):\n"); for (int i = 0; i < m; i++) {
int u, v;
add_edge(u, v, i);
add_edge(v, u, i);
}
int start_node = -1;
for (int i = 0; i < n; i++) {
if (degree[i] % 2 != 0) {
printf("Khong co chu trinh Euler).\n", i
); return 0;
}
if (degree[i] > 0 && start_node == -1) start_node = i;
}
if (m > 0 && start_node == -1) return 0;
if (m
== 0) { printf("0\n"); return 0; }
find_circuit(start_node);
if (circuit_size != m + 1) {
printf("Do thi khong lien thong.\n"); } else {
for (int i = circuit_size - 1; i >= 0; i--) {
printf("%d%s", circuit
[i
], (i
== 0 ? "" : " -> ")); }
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CgojZGVmaW5lIE1BWFYgMTAwMDUKI2RlZmluZSBNQVhFIDIwMDAwNQoKaW50IGhlYWRbTUFYVl07IAppbnQgdG9bTUFYRV07CmludCBuZXh0X2VkZ2VbTUFYRV07CmludCBlZGdlX2lkW01BWEVdOwppbnQgZWRnZV9jb3VudCA9IDA7Cgpib29sIHVzZWRfZWRnZVtNQVhFIC8gMl07CmludCBkZWdyZWVbTUFYVl07CmludCBjaXJjdWl0W01BWEVdOwppbnQgY2lyY3VpdF9zaXplID0gMDsKCnZvaWQgYWRkX2VkZ2UoaW50IHUsIGludCB2LCBpbnQgaWQpIHsKICAgIHRvW2VkZ2VfY291bnRdID0gdjsKICAgIGVkZ2VfaWRbZWRnZV9jb3VudF0gPSBpZDsKICAgIG5leHRfZWRnZVtlZGdlX2NvdW50XSA9IGhlYWRbdV07CiAgICBoZWFkW3VdID0gZWRnZV9jb3VudCsrOwogICAgZGVncmVlW3VdKys7Cn0KCnZvaWQgZmluZF9jaXJjdWl0KGludCB1KSB7CiAgICB3aGlsZSAoaGVhZFt1XSAhPSAtMSkgewogICAgICAgIGludCBpID0gaGVhZFt1XTsKICAgICAgICBoZWFkW3VdID0gbmV4dF9lZGdlW2ldOwoKICAgICAgICBpbnQgaWQgPSBlZGdlX2lkW2ldOwogICAgICAgIGlmICh1c2VkX2VkZ2VbaWRdKSBjb250aW51ZTsKCiAgICAgICAgdXNlZF9lZGdlW2lkXSA9IHRydWU7CiAgICAgICAgZmluZF9jaXJjdWl0KHRvW2ldKTsKICAgIH0KICAgIGNpcmN1aXRbY2lyY3VpdF9zaXplKytdID0gdTsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbiwgbTsKICAgIHByaW50ZigiTmhhcCBzbyBkaW5oIHZhIHNvIGNhbmg6ICIpOwogICAgaWYgKHNjYW5mKCIlZCAlZCIsICZuLCAmbSkgIT0gMikgcmV0dXJuIDA7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBoZWFkW2ldID0gLTE7CiAgICAgICAgZGVncmVlW2ldID0gMDsKICAgIH0KCiAgICBwcmludGYoIk5oYXAgY2FjIGNhbmggKHUgdik6XG4iKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgc2NhbmYoIiVkICVkIiwgJnUsICZ2KTsKICAgICAgICBhZGRfZWRnZSh1LCB2LCBpKTsKICAgICAgICBhZGRfZWRnZSh2LCB1LCBpKTsKICAgIH0KCiAgICBpbnQgc3RhcnRfbm9kZSA9IC0xOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAoZGVncmVlW2ldICUgMiAhPSAwKSB7CiAgICAgICAgICAgIHByaW50ZigiS2hvbmcgY28gY2h1IHRyaW5oIEV1bGVyKS5cbiIsIGkpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlZ3JlZVtpXSA+IDAgJiYgc3RhcnRfbm9kZSA9PSAtMSkgc3RhcnRfbm9kZSA9IGk7CiAgICB9CgogICAgaWYgKG0gPiAwICYmIHN0YXJ0X25vZGUgPT0gLTEpIHJldHVybiAwOwogICAgaWYgKG0gPT0gMCkgeyBwcmludGYoIjBcbiIpOyByZXR1cm4gMDsgfQoKICAgIGZpbmRfY2lyY3VpdChzdGFydF9ub2RlKTsKCiAgICBpZiAoY2lyY3VpdF9zaXplICE9IG0gKyAxKSB7CiAgICAgICAgcHJpbnRmKCJEbyB0aGkga2hvbmcgbGllbiB0aG9uZy5cbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoIkNodSB0cmluaCBFdWxlcjogIik7CiAgICAgICAgZm9yIChpbnQgaSA9IGNpcmN1aXRfc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQlcyIsIGNpcmN1aXRbaV0sIChpID09IDAgPyAiIiA6ICIgLT4gIikpOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K