• 47. 参加科学大会(第六期模拟笔试)(最短路)


    链接:卡码网KamaCoder

    题目:

    样例:

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

    输出
    5

    思路:

            由题意,很明显这是一道最短路径问题,但是不同的是,这里没有给出边的长度,而是以结点权值的形式,变相的作为边长,这一我们应该注意的是,这里的意思为

    从 a 点到 b点所花时间为   b  即  g[a][b] = b  ,从 b 点到 a 点所花时间为  a  即  g[b][a] = a 

    所以我们根据题意,更改一下Dijkstra模板函数即可。

    代码详解如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define endl '\n'
    7. #define int long long
    8. #define YES puts("YES")
    9. #define NO puts("NO")
    10. #define umap unordered_map
    11. #define INF 0x3f3f3f3f
    12. #define All(x) (x).begin(),(x).end()
    13. #pragma GCC optimize(3,"Ofast","inline")
    14. #define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
    15. using namespace std;
    16. const int N = 1500 + 10;
    17. int n,m;
    18. int g[N][N]; // 所到结点所花的时间,即路径长度
    19. umap<int,int>dist; // 记录最短路径
    20. umap<int,int>d; // 记录结点权值,即所花时间
    21. umap<int,bool>st;
    22. inline int Dijkstra()
    23. {
    24. // 初始化起点最短距离
    25. dist[1] = d[1];
    26. // 初始化 dist ,走一遍起点到每一个点的最短距离
    27. for(int i = 2;i <= n;++i)
    28. {
    29. dist[i] = g[1][i];
    30. }
    31. // 从起点走完一遍后,标记起点我们检查过了
    32. st[1] = true;
    33. // 这里 i = 2 是因为我们刚开始已经走过一遍起点了
    34. for(int i = 2;i < n;++i)
    35. {
    36. // t 探头探索哪一个点所花时间最少,即最短距离
    37. int t = -1;
    38. for(int j = 1;j <= n;++j)
    39. {
    40. if(!st[j] && (t == -1 || dist[j] < dist[t])) t = j;
    41. }
    42. // 标记并走向该结点
    43. st[t] = true;
    44. // 更新所有结点最短距离
    45. for(int j = 1;j <= n;++j)
    46. {
    47. dist[j] = min(dist[j],dist[t] + g[t][j]);
    48. }
    49. }
    50. // 这里返回结果最后加上 d[1] 是因为可能起点也有需要花费的时间
    51. return dist[n] + d[1];
    52. }
    53. inline void solve()
    54. {
    55. memset(g,INF,sizeof g);
    56. cin >> n >> m;
    57. // 输入结点权值
    58. for(int i = 1;i <= n;++i)
    59. {
    60. cin >> d[i];
    61. }
    62. while(m--)
    63. {
    64. int a,b;
    65. cin >> a >> b;
    66. // 记录 a 点 到 b 点 的距离
    67. g[a][b] = d[b];
    68. // 记录 b 点 到 a 点 的距离
    69. g[b][a] = d[a];
    70. }
    71. int ans = Dijkstra();
    72. cout << ans << endl;
    73. }
    74. signed main()
    75. {
    76. // freopen("a.txt", "r", stdin);
    77. ___G;
    78. int _t = 1;
    79. // cin >> _t;
    80. while (_t--)
    81. {
    82. solve();
    83. }
    84. return 0;
    85. }

    最后提交:

  • 相关阅读:
    js的算法-交换排序(冒泡)
    ConcurrentHashMap解析
    [区间dp]添加括号
    【入门-06】系统定时器
    【React】第十五部分 React-Router6
    小鹏的「智能困局」
    RESR开发
    android 7.1 mipi 屏 唤醒白屏
    关于RSA常见的错误理解
    el-tree实现表格方式菜单
  • 原文地址:https://blog.csdn.net/hacker_51/article/details/133103846