记录编号 |
577309 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[POJ 1734]观光旅行 |
最终得分 |
100 |
用户昵称 |
lihaoze |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.000 s |
提交时间 |
2022-10-31 11:17:20 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include "bits/stdc++.h"
using i64 = long long;
const int N = 110, INF = 0x3f3f3f3f;
int n, m;
int a[N][N], dist[N][N], pos[N][N];
std::vector<int> path;
void get(int x, int y) {
if (pos[x][y] == 0) return;
get(x, pos[x][y]);
path.emplace_back(pos[x][y]);
get(pos[x][y], y);
}
int main() {
freopen("sightseeingtrip.in", "r", stdin);
freopen("sightseeingtrip.out", "w", stdout);
std::cin >> n >> m;
memset(a, 0x3f, sizeof a);
for (int i = 1; i <= n; ++ i) {
a[i][i] = 0;
}
for (int i = 1; i <= m; ++ i) {
int x, y, z;
std::cin >> x >> y >> z;
a[x][y] = a[y][x] = std::min(a[x][y], z);
}
memcpy(dist, a, sizeof dist);
i64 ans = INF;
for (int k = 1; k <= n; ++ k) {
for (int i = 1; i < k; ++ i) {
for (int j = i + 1; j < k; ++ j) {
if ((i64) dist[i][j] + a[i][k] + a[k][j] < ans) {
ans = dist[i][j] + a[i][k] + a[k][j];
path.clear();
path.emplace_back(k);
path.emplace_back(i);
get(i, j);
path.emplace_back(j);
}
}
}
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
if (dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
pos[i][j] = k;
}
}
}
}
if (ans == INF) {
std::cout << "No solution." << '\n';
} else {
for (int i : path) {
std::cout << i << ' ';
}
std::cout << '\n';
}
return 0;
}