#include #include #include #include #include #include #include #include #include #include #include using namespace std; const int N = 2010, M = N * N; // 声明结构体 struct Node { int a, b, c; bool const operator<(const Node &t) const { return c > t.c; } } g[N]; int st[M]; // 某条边是不是访问过,无向图一般用于处理成对就换的边 int d[N]; // 度 int res[M], rl; // 路径数组 int m; // m条边 // 链式前向星 int e[M], h[N], idx, w[M], ne[M]; void add(int a, int b, int c = 0) { e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; } void dfs(int u) { for (int i = h[u]; ~i; i = h[u]) { // 删边优化 h[u] = ne[i]; if (st[i]) continue; st[i] = st[i ^ 1] = 1; // 成对变换 dfs(e[i]); // 记录路径 res[++rl] = w[i]; } } int main() { #ifndef ONLINE_JUDGE freopen("POJ1041.in", "r", stdin); #endif int a, b, c; while (true) { memset(d, 0, sizeof d); memset(st, 0, sizeof st); memset(h, -1, sizeof h); memset(res, 0, sizeof res); idx = rl = m = 0; // 本题的输入挺奇怪的,需要使用while(true)+do while的方式来读取最方便 scanf("%d%d", &a, &b); if (a == 0 && b == 0) exit(0); do { scanf("%d", &c); g[m].a = a, g[m].b = b, g[m++].c = c; scanf("%d%d", &a, &b); } while (a && b); // 针对边的边号进行由小到大排序 sort(g, g + m); for (int i = 0; i < m; i++) { int a = g[i].a, b = g[i].b, c = g[i].c; add(a, b, c), add(b, a, c); d[a]++, d[b]++; } int flag = 0; for (int i = 0; i < m; i++) { int a = g[i].a, b = g[i].b; if ((d[a] & 1) || (d[b] & 1)) { flag = 1; break; } } if (!flag) { dfs(1); // 逆序输出序列 for (int i = rl; i; i--) printf("%d ", res[i]); } else cout << "Round trip does not exist."; puts(""); } return 0; }