单源最短路径Floyd算法实现

def floyd_warshall(G):
    nodes=len(G)
    dis=[row[:] for row in G]
    #一共需要进行nodes次数跟新
    for k in range(nodes):
        for i in range(nodes):
            for j in range(nodes):
                """
                如果D[v][k] + D[k][w] 为更小值,
                则把D[v][k] + D[k][w] 覆盖保存在D[v][w]中
                """
                """
                if C->B->A->G
                dis(C,G)=dis(C,B)+dis(B,G)
                dis(B,G)=dis(B,A)+dis(A,G)
                每个循环内只保留单步更新
                """
                if dis[i][k]+dis[k][j]<dis[i][j]:
                    dis[i][j]=dis[i][k]+dis[k][j]
    return dis

if __name__=="__main__":
    inf=float('inf')
    G= [
    [0, 3, inf, inf, inf],
    [2, 0, inf, inf, inf],
    [inf, 7, 0, 1, inf],
    [6, inf, inf, 0, 2],
    [inf, inf, inf, inf, 0]]
    shortest_paths = floyd_warshall(G)
    source = 2#以c作为圆点 
    nodes = ['A', 'B', 'C', 'D', 'E']  # 节点名称
    print(f"选择{nodes[source]}作为源点:")
    for i in range(len(shortest_paths)):
        if i != source:  # 只打印到其他节点的距离
            destination = nodes[i]
            distance = shortest_paths[source][i]
            if distance == inf:
                print(f"{nodes[source]}到{destination}的距离为: No path")
            else:
                print(f"{nodes[source]}到{destination}的距离为: {distance}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔济沧海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值