AcWing 854 Floyd求最短路
发布日期:2021-05-28 16:26:40 浏览次数:32 分类:精选文章

本文共 1611 字,大约阅读时间需要 5 分钟。

为了解决问题,我们需要找到从点x到点y的最短距离,如果不存在路径则输出“impossible”。我们将使用Floyd-Warshall算法来解决这个问题。Floyd-Warshall算法能够处理有向图中的最短路径问题,特别是处理负权重的情况,适用于本题的情况。

方法思路

  • 初始化距离矩阵:创建一个n x n的矩阵d,其中d[i][j]表示从点i到点j的最短距离。初始化所有值为一个很大的数(INF),对角线元素d[i][i]设为0。
  • 读取边信息并更新距离矩阵:对于每条边(x, y, z),更新d[x][y]为min(d[x][y], z)。
  • Floyd-Warshall算法:通过三重循环更新距离矩阵,使得每个节点i到节点j的最短路径经过所有可能的中间节点k进行计算。
  • 处理查询:对于每个查询(x, y),检查d[x][y]是否是INF。如果是,输出“impossible”,否则输出d[x][y]的值。
  • 解决代码

    #include 
    #include
    #include
    using namespace std;int main() { int n, m, k; scanf("%d %d %d", &n, &m, &k); int INF = 1 << 30; int d[n+1][n+1]; for (int i=1; i<=n; i++) { for (int j=1; j<=n; j++) { d[i][j] = INF; } d[i][i] = 0; } for (int i=1; i<=m; i++) { int x, y, z; scanf("%d %d %d", &x, &y, &z); if (d[x][y] > z) { d[x][y] = z; } } // Floyd-Warshall算法 for (int k=1; k<=n; k++) { for (int i=1; i<=n; i++) { for (int j=1; j<=n; j++) { if (d[i][j] > d[i][k] + d[k][j]) { d[i][j] = d[i][k] + d[k][j]; } } } } while(k--) { int x, y; scanf("%d %d", &x, &y); if (d[x][y] == INF) { puts("impossible"); } else { puts(to_string(d[x][y])); } } return 0;}

    代码解释

  • 初始化距离矩阵:创建一个大小为(n+1)x(n+1)的矩阵d,节点编号从1开始。所有元素初始化为INF,表示初始距离为无穷大,对角线为0。
  • 读取边信息:读取每条边并更新距离矩阵中的相应值,确保每条边的权重更优。
  • Floyd-Warshall算法
    • 外层循环k遍历每个潜在的中间节点。
    • 中间循环i遍历起点,j遍历终点。
    • 计算是否通过中间节点k从i到j更短,更新d[i][j]。
  • 处理查询:逐个处理查询,检查距离是否为INF,若为则输出“impossible”,否则输出最短距离。
  • 上一篇:.net MVC 登陆模块后台代码
    下一篇:AcWing 852 spfa判断负环

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月16日 08时14分58秒