弗洛伊德(Floyd)算法

本文深入解析了弗洛伊德算法,一种用于求解任意顶点间最短路径的有效方法。介绍了算法的基本原理,包括邻接矩阵和路径矩阵的概念,以及迭代更新的过程。最后,提供了详细的Python代码实现。

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

弗洛伊德(Floyd)算法可求解任意顶点间的最短路径。

在Floyd算法中,需要两个矩阵,一个是邻接矩阵A,最开始,A[i][j]的值为节点i到节点j的边的权值,如果i到j没有边,A[i][j]=\infty,特别地,A[i][i]=0。另一个矩阵为P,P[i][j]的值为从i到j的路径上节点i的下一个节点,通过该矩阵可以找出任意节点i到节点j的最短路径。最开始,若i与相邻,则P[i][j]=j,否则P[i][j]=-1。

之后将对A和P进行n次迭代更新过程,n为节点个数,迭代更新原则是:

A_{k+1}[i][j]=min{}\left \{ A_{k}[i][j],A_{k}[i][k]+A_{k}[k][j] \right \}(0\leqslant k\leqslant n-1)

如果A_{k+1}[i][j]=A_{k}[i][k]+A_{k}[k][j],那么P_{_{k+1}}[i][j]=P_{_{k}}[i][k]

最终得到的A[i][j]就是i到j的最短路径长度,P[i][j]是i到j的最短路径上,i节点的下一个节点。

以下是Floyd算法的python代码

import numpy as np
def floyd_shortest_paths(graph):
    vnum=graph.vertex_num()
    a=[[graph.get_edge(i,j) for j in range(vnum)]\
       for i in range(vnum)]
    p=[[-1 if a[i][j]==np.inf else j for j in range(vnum)] \
       for i in range(vnum)]
    for k in range(vnum):
        for i in range(vnum):
            for j in range(vnum):
                if a[i][j]>a[i][k]+a[k][j]:
                    a[i][j]=a[i][k]+a[k][j]
                    p[i][j]=p[i][k]
    return (a,p)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值