记录编号 577309 评测结果 AAAAAAAAAA
题目名称 [POJ 1734]观光旅行 最终得分 100
用户昵称 Gravatarlihaoze 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2022-10-31 11:17:20 内存使用 0.00 MiB
显示代码纯文本
  1. #include "bits/stdc++.h"
  2.  
  3. using i64 = long long;
  4.  
  5. const int N = 110, INF = 0x3f3f3f3f;
  6. int n, m;
  7. int a[N][N], dist[N][N], pos[N][N];
  8. std::vector<int> path;
  9.  
  10. void get(int x, int y) {
  11. if (pos[x][y] == 0) return;
  12. get(x, pos[x][y]);
  13. path.emplace_back(pos[x][y]);
  14. get(pos[x][y], y);
  15. }
  16.  
  17. int main() {
  18. freopen("sightseeingtrip.in", "r", stdin);
  19. freopen("sightseeingtrip.out", "w", stdout);
  20. std::cin >> n >> m;
  21. memset(a, 0x3f, sizeof a);
  22. for (int i = 1; i <= n; ++ i) {
  23. a[i][i] = 0;
  24. }
  25. for (int i = 1; i <= m; ++ i) {
  26. int x, y, z;
  27. std::cin >> x >> y >> z;
  28. a[x][y] = a[y][x] = std::min(a[x][y], z);
  29. }
  30. memcpy(dist, a, sizeof dist);
  31. i64 ans = INF;
  32. for (int k = 1; k <= n; ++ k) {
  33. for (int i = 1; i < k; ++ i) {
  34. for (int j = i + 1; j < k; ++ j) {
  35. if ((i64) dist[i][j] + a[i][k] + a[k][j] < ans) {
  36. ans = dist[i][j] + a[i][k] + a[k][j];
  37. path.clear();
  38. path.emplace_back(k);
  39. path.emplace_back(i);
  40. get(i, j);
  41. path.emplace_back(j);
  42. }
  43. }
  44. }
  45. for (int i = 1; i <= n; ++ i) {
  46. for (int j = 1; j <= n; ++ j) {
  47. if (dist[i][j] > dist[i][k] + dist[k][j]) {
  48. dist[i][j] = dist[i][k] + dist[k][j];
  49. pos[i][j] = k;
  50. }
  51. }
  52. }
  53. }
  54. if (ans == INF) {
  55. std::cout << "No solution." << '\n';
  56. } else {
  57. for (int i : path) {
  58. std::cout << i << ' ';
  59. }
  60. std::cout << '\n';
  61. }
  62. return 0;
  63. }