2.1 Floyd's Shortest Path Algorithm

本文深入讲解了Floyd算法,一种用于解决所有顶点对最短路径问题的经典算法。通过逐步解析算法过程,从邻接矩阵表示到距离矩阵的构建,再到最短路径的查找,帮助读者理解并掌握Floyd算法的核心思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Floyd’s Shortest Path

1. 问题

用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵)在这里插入图片描述

2. 解析

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i][j]=d,d表示该路的长度;否则G[i][j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i][j]表示从Vi到Vj需要经过的点,初始化D[i][j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i][j] = min( G[i][j], G[i][k]+G[k][j] ),如果G[i][j]的值变小,则D[i][j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 设计

 void floydWarshell(int graph[][]){
        int i, j, k;
        for(k = 0; k < V; k++){
            for(i = 0; i < V; i++){
                for(j = 0; j < V; j++){
                    if(graph[i][j] > graph[i][k] + graph[k][j]){
                        graph[i][j] = graph[i][k] + graph[k][j];
                    }
                }
            }
        }
    }

4. 源码

https://github.com/Marshmello11/Algorithm/tree/master/Experiment_2

### Floyd-Warshall算法的原理 Floyd-Warshall算法是一种用于计算加权图中所有节点对之间最短路径的经典动态规划算法。它适用于有向或无向图,并能够处理负权重边的情况,只要不存在负权重环即可[^2]。 该算法的核心思想在于逐步优化路径长度。通过引入中间节点的概念,每次迭代都会尝试更新任意两点之间的距离,判断是否存在经过当前中间节点而使路径更短的可能性。具体来说,对于每一对顶点 \(i\) 和 \(j\),如果存在一个中间顶点 \(k\) 能够使得从 \(i\) 到 \(j\) 的路径变得更短,则更新它们的距离矩阵中的对应值。 #### 初始化阶段 在开始执行核心逻辑之前,需要初始化一个二维数组来表示初始状态下的各点间最小距离。通常情况下,这个数组可以基于输入图的邻接矩阵构建而成。其中,若两节点直接相连则取其对应的边权作为初值;否则设为无穷大(`float('inf')`),表明两者目前尚无已知连接关系[^5]。 ```python def floyd_warshall(graph): """ Implementation of the Floyd-Warshall algorithm. :param graph: The input graph represented as an adjacency matrix. Each element `graph[i][j]` contains either the weight of the edge from node i to j, or float('inf') if no direct connection exists. :return: A new distance matrix containing the shortest path lengths between every pair of vertices. """ n = len(graph) # Initialize the distance matrix with the same values as the given graph dist = [[val for val in row] for row in graph] # Iteratively improve upon these initial estimates using intermediate nodes k=0..n-1 for k in range(n): for i in range(n): for j in range(n): if dist[i][k] + dist[k][j] < dist[i][j]: dist[i][j] = dist[i][k] + dist[k][j] return dist ``` 此函数接受一个代表图形结构的邻接矩阵形式的数据集作为参数,并返回一个新的矩阵,其中包含了各个顶点间的最短路径长度信息[^2]^。 注意,在实际应用过程中还需要考虑如何检测并报告可能存在的负圈问题——即当某个位置上的数值变得小于零时意味着发现了这样的循环结构,此时应停止进一步运算并向调用者发出警告提示。 ### 示例代码解释 上述Python实现展示了完整的弗洛伊德沃舍尔过程: 1. **定义功能签名**: 接收一个描述图表关联性的列表嵌套列表(`graph`)。 2. **复制原始数据到工作副本**(dist)以便保留原样不变的同时操作新变量。 3. **三重循环遍历所有的可能性组合**, 对于每一个潜在中介站点(k),重新评估其余任何两个端点(i,j)能否经由前者获得更好的解决方案。 4. 如果发现新的较优路线,则立即替换旧记录。 5. 完成全部扫描之后输出最终结果表单(dist). 这种逐层深入的方式保证了即使面对复杂网络环境也能找到全局最优解方案.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值