Floyd最短路问题

话不多说,直接上代码

import numpy as np
import networkx as nx

# floyd算法求两点vi与vj之间的最短路径长度以及最短路径经过的顶点序列
# 下列程序默认节点从0开始顺序编号,且vi<vj
def floyd(W, n, vi, vj):
    U = W.copy()
    m = 0
    while m<n:
        for i in range(n):
            for j in range(n):
                if U[i][j] > U[i][m] + U[m][j]:
                    U[i][j] = U[i][m] + U[m][j]

        m += 1

    # 求vi与vj之间最短路径经过的顶点序列
    P1 = np.zeros(n)
    k = 0
    P1[k] = vj
    kk = vj
    V = np.ones(n)*np.inf
    while kk != vi:
        for i in range(n):
            V[i] = U[vi][kk] - W[i][kk]
            if V[i] == U[vi][i]:
                P1[k+1] = i
                kk = i
                k += 1

    path = []  # vi与vj之间最短路径经过的顶点序列
    wrow = np.nonzero(P1)[0]

    # 如果初始节点编号是0
    if vi == 0:
        path.append(vi)

    for i in np.arange(len(wrow)-1,-1,-1):
        path.append(int(P1[wrow[i]]))

    return U[vi][vj], path


if __name__ == '__main__':
    # 无向加权图
    G = nx.Graph()
    nodes = [0,1,2,3,4,5,6,7]
    edge_list = [(0,1,2),(0,2,8),(0,3,1),(1,2,6),
                 (1, 4, 1), (2, 3, 7), (2, 4, 5), (2, 5, 1),
                 (2,6,2),(3,6,9),(4,5,3),(4,7,8),
                 (5,6,4),(5,7,6),(6,7,3)]
    G.add_nodes_from(nodes)
    G.add_weighted_edges_from(edge_list)

    # 获取无向图的加权邻接矩阵
    As = nx.adjacency_matrix(G)
    A = np.array(As.todense())
    n = np.shape(A)[0]
    W = A.astype(np.float64)

    for i in range(n):
        for j in range(n):
            if i!=j and W[i][j] == 0:
                W[i][j] = np.inf


    vi, vj = 0, 7
    dij, path_ij = floyd(W, n, vi, vj)
    print("节点{}和{}之间的最短路径为{},其长度为{}".format(vi, vj, path_ij, dij))

    vi, vj = 1, 6
    dij, path_ij = floyd(W, n, vi, vj)
    print("节点{}和{}之间的最短路径为{},其长度为{}".format(vi, vj, path_ij, dij))

    vi, vj = 0, 6
    dij, path_ij = floyd(W, n, vi, vj)
    print("节点{}和{}之间的最短路径为{},其长度为{}".format(vi, vj, path_ij, dij))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixin_17839606517

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

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

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

打赏作者

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

抵扣说明:

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

余额充值