You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
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;
}