Floyd算法

本文介绍Floyd算法,一种解决任意两点间最短路径问题的方法,适用于有向图或包含负权边的情况。通过Python实现,展示了如何计算图中任意两点间的最短距离。

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

 

Floyd算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,被用于计算图中任意两点间的距离。算法的时间复杂度为O(N3),空间复杂度为O(N2)。

算法思想

     通俗的语言来描述,即首先我们的目标是寻找从点i到点j的最短路径,而从任意节点i到任意节点j的最短路径不外乎2种可能,要么直接从i到j,要么从i经过若干个节点k到j。因此,假设Dis(i,j)为节点u到节点v的最短路径的距离,然后依次取遍所有图中的点作为中间结点,检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明  i—>k—>j 比i—>j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j)。如此,当遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

举个简单例子:求下图中从点1到点8,点9,点10的最短距离。

具体算法(Python):

 

if __name__ == '__main__':
    maxInt = 999999
    data = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0],
            [0, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0],
            [0, 7, 0, 0, 0, 0, 0, 0, 0, 12, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 2],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0]]
    path = []
    for j in range(0, 11):
        p = []
        for i in range(0, 11):
            p.append(-1)
            if data[j][i] == 0:
                data[j][i] = maxInt
        path.append(p)

    for v0 in range(1, 11):
        for m in range(1, 11):
            for k in range(1, 11):
                if data[v0][m] > (data[v0][k] + data[k][m]):
                    data[v0][m] = data[v0][k] + data[k][m]
                    path[v0][m] = k
                    # print data[v0][m]

    print data[1][8]
    print data[1][9]
    print data[1][10]

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值