
AcWing 854 Floyd求最短路
初始化距离矩阵:创建一个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]的值。 初始化距离矩阵:创建一个大小为(n+1)x(n+1)的矩阵d,节点编号从1开始。所有元素初始化为INF,表示初始距离为无穷大,对角线为0。 读取边信息:读取每条边并更新距离矩阵中的相应值,确保每条边的权重更优。 Floyd-Warshall算法: 处理查询:逐个处理查询,检查距离是否为INF,若为则输出“impossible”,否则输出最短距离。
发布日期:2021-05-28 16:26:40
浏览次数:32
分类:精选文章
本文共 1611 字,大约阅读时间需要 5 分钟。
为了解决问题,我们需要找到从点x到点y的最短距离,如果不存在路径则输出“impossible”。我们将使用Floyd-Warshall算法来解决这个问题。Floyd-Warshall算法能够处理有向图中的最短路径问题,特别是处理负权重的情况,适用于本题的情况。
方法思路
解决代码
#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;}
代码解释
- 外层循环k遍历每个潜在的中间节点。
- 中间循环i遍历起点,j遍历终点。
- 计算是否通过中间节点k从i到j更短,更新d[i][j]。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月16日 08时14分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Explore Optimization
2019-03-07
解决数据库报ORA-02289:序列不存在错误
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08
成功解决升级virtualenv报错问题
2019-03-08
【SQLI-Lab】靶场搭建
2019-03-08
【Bootstrap5】精细学习记录
2019-03-08
Struts2-从值栈获取list集合数据(三种方式)
2019-03-08
参考图像
2019-03-09
设计模式(18)——中介者模式
2019-03-09
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
BUU-MISC-caesar
2019-03-09
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
2019-03-09
一文理解设计模式--命令模式(Command)
2019-03-09
VTK:可视化之RandomProbe
2019-03-09
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09