• 最短路径专题8 交通枢纽 (Floyd求最短路 )


    题目:

    样例:

    输入
    1. 4 5 2
    2. 0 1 1
    3. 0 2 5
    4. 0 3 3
    5. 1 2 2
    6. 2 3 4
    7. 0 2
    输出
    0 7

    思路:

            由题意,绘制了该城市的地图之后,由给出的 k 个编号作为起点,求该点到各个点之间的最短距离之和最小的点是哪个,并输出该点,和该点到各个点之间的最短距离之和。

            这又是一个多起点多终点的题型,所以用 Floyd 算法非常的有效率。

    代码详解如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define endl '\n'
    7. #define x first
    8. #define y second
    9. #define mk make_pair
    10. #define int long long
    11. #define NO puts("NO")
    12. #define YES puts("YES")
    13. #define umap unordered_map
    14. #define INF 0x3f3f3f3f
    15. #define All(x) (x).begin(),(x).end()
    16. #pragma GCC optimize(3,"Ofast","inline")
    17. #define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
    18. using namespace std;
    19. const int N = 2e6 + 10,M = 500;
    20. using PII = pair<int,int>;
    21. int n,m,k;
    22. int dist[M][M]; // 定义各个点之间的最短距离数组
    23. // 初始化各个点之间的最短距离
    24. inline void Init()
    25. {
    26. memset(dist,INF,sizeof dist);
    27. // 自身点之间的距离是 0
    28. for(int i = 0;i <= n;++i)
    29. {
    30. dist[i][i] = 0;
    31. }
    32. }
    33. inline void Floyd()
    34. {
    35. // 这一层是中间点
    36. for(int k = 0;k < n;++k)
    37. {
    38. // 这一层是 i 点
    39. for(int i = 0;i < n;++i)
    40. {
    41. // 这一层是 j 点
    42. for(int j = 0;j < n;++j)
    43. {
    44. // 更新选取最短的 i 到 j 的最短距离方案 ,即 i 到 k ,k 再到 j
    45. dist[i][j] = min(dist[i][j],dist[i][k] + dist[k][j]);
    46. }
    47. }
    48. }
    49. }
    50. // 由 x 点到各个点之间的最短距离之和
    51. inline int DistSum(int x)
    52. {
    53. int sum = 0;
    54. for(int i = 0;i < n;++i)
    55. {
    56. sum += dist[x][i];
    57. }
    58. return sum;
    59. }
    60. inline void solve()
    61. {
    62. cin >> n >> m >> k;
    63. Init(); // 初始化最短路距离数组
    64. while(m--)
    65. {
    66. int a,b,c;
    67. cin >> a >> b >> c;
    68. // 记录两个点之间的最短距离,min 防止自环
    69. dist[a][b] = dist[b][a] = min(dist[a][b],c);
    70. }
    71. // 开始求各个点之间的最短距离
    72. Floyd();
    73. PII ans = {-1,-1}; // 答案城市编号,已经答案城市到各个点之间的最短距离之和
    74. while(k--)
    75. {
    76. int a;
    77. cin >> a; // 获取城市编号点
    78. int distSum = DistSum(a); // 求最短距离之和
    79. if(ans.x == -1) ans = {a,distSum}; // 记录第一个点
    80. else if(ans.y > distSum) ans = {a,distSum}; // 更新更短的最短距离之和的点做 交通枢纽
    81. }
    82. // 输出答案
    83. cout << ans.x << ' ' << ans.y << endl;
    84. }
    85. signed main()
    86. {
    87. // freopen("a.txt", "r", stdin);
    88. // ___G;
    89. int _t = 1;
    90. // cin >> _t;
    91. while (_t--)
    92. {
    93. solve();
    94. }
    95. return 0;
    96. }

    最后提交:

  • 相关阅读:
    docker commit 的简单使用
    nodejs采集淘宝、天猫网商品详情数据以及解决_m_h5_tk令牌及sign签名验证(2023-09-09)
    【无标题】
    高度关注,2022开放原子开源峰会最新议程一览
    【Python】OS 模块简介
    MySQL - 索引的数据结构
    【C++要笑着学】Functor 仿函数 | 模拟实现 stack & queue | 模拟实现优先级队列
    【JS】牛客专项练习02
    UNet 网络做图像分割DRIVE数据集
    python刷算法的一些骚操作(一)
  • 原文地址:https://blog.csdn.net/hacker_51/article/details/133690886