Floyd算法简介
Floyd算法
floyd算法(多源最短路径) python实现
例题
求下图各节点最短路径
在这里插入图片描述
Floyd算法如下:

from math import *
import numpy as np
#创建节点字典
set_nodes={"v1":0,"v2":1,"v3":2,"v4":3,"v5":4,"v6":5,"v7":6,"v8":7,"v9":8,"v10":9,"v11":10}

#创建初始化距离矩阵
dis = np.array([[0,2,8,1,inf,inf,inf,inf,inf,inf,inf],\
                [2,0,6,inf,1,inf,inf,inf,inf,inf,inf],\
                [8,6,0,7,5,1,2,inf,inf,inf,inf],\
                [1,inf,7,0,inf,inf,9,inf,inf,inf,inf],\
                [inf,1,5,inf,0,3,inf,2,9,inf,inf],\
                [inf,inf,1,inf,3,0,4,inf,6,inf,inf],\
                [inf,inf,2,9,inf,4,0,inf,3,1,inf],\
                [inf,inf,inf,inf,2,inf,inf,0,7,inf,9],\
                [inf,inf,inf,inf,9,6,3,7,0,1,2],\
                [inf,inf,inf,inf,inf,inf,1,inf,1,0,4],\
                [inf,inf,inf,inf,inf,inf,inf,9,2,4,0]])

#初始化一个矩阵 记录父节点 先令父节点为终点本身
parent=[[i for i in range(11)] for j in range(11)]

#核心代码
#i为中间节点
for i in range(len(set_nodes)):
    #j为起点
    for j in range(len(set_nodes)):
        #k为终点
        for k in range(len(set_nodes)):
            #更新最短距离
            dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k])
            parent[j][k]=parent[j][i]

#测试代码
if __name__ == '__main__':
    print("各点的之间的最短距离\n",dis)
    start, end = input("请输入起始点:").split()
    print(dis[set_nodes[start]][set_nodes[end]])

上例可通过添加中间节点来导出路径,请完善,望指教。

以下是摘取别人的代码(打印出了路径),请大家参考:

'''最短路径和Floyd算法'''
from math import *
print("point=('v_1','v_2','v_3','v_4','v_5','v_6','v_7','v_8','v_9','v_10','v_11')")
p=int(input("请输入如1表示v_1形式的起点(v_1--v_11):"))
q=int(input("请输入如1表示v_1形式的终点(v_1--v_11):"))

point=('v_1','v_2','v_3','v_4','v_5','v_6','v_7','v_8','v_9','v_10','v_11')
num=len(point)
distance_0=[[0,2,8,1,inf,inf,inf,inf,inf,inf,inf],      #图形最初任意两点直接距离矩阵
           [2,0,6,inf,1,inf,inf,inf,inf,inf,inf],
           [8,6,0,7,5,1,2,inf,inf,inf,inf],
           [1,inf,7,0,inf,inf,9,inf,inf,inf,inf],
           [inf,1,5,inf,0,3,inf,2,9,inf,inf],
           [inf,inf,1,inf,3,0,4,inf,6,inf,inf],
           [inf,inf,2,9,inf,4,0,inf,3,1,inf],
           [inf,inf,inf,inf,2,inf,inf,0,7,inf,9],
           [inf,inf,inf,inf,9,6,3,7,0,1,2],
           [inf,inf,inf,inf,inf,inf,1,inf,1,0,4],
           [inf,inf,inf,inf,inf,inf,inf,9,2,4,0]]

prior = [[0 for i in range(1,12)] for j in range(1,12)]   #初始化一个空矩阵用来存放所经过的节点
for i in range(num):
    for j in range(num):
        prior[i][j]=j+1
# print(prior)
for m in range(num):      #i相当于是中间点
    for i in range(num):      #j相当于是起始点
        for j in range(num):      #m相当于是终点
            if (distance_0[i][j] > distance_0[i][m]+distance_0[m][j]):
                distance_0[i][j] = distance_0[i][m]+distance_0[m][j]
                prior[i][j]=prior[i][m]
            else:
                continue
# print("v_1到v_11的最短路程为:",distance_0[0][10])      #打印v_1到v_11距离
# print("v_%d"%p,"到v_%d"%q,"的最短路程为:",distance_0[p-1][q-1])       #打印任意两点距离
if prior[p-1][q-1]==q:
    print('v_%d'%p,'到v_%d'%q,'的路径为:v_%d'%(p)+'->'+'v_%d'%(q),":","路程为:",distance_0[p-1][q-1])
else:
    x=prior[p-1][q-1]
    mid=[x]      #创建一个空列表装载路径中间点
    while (prior[x-1][q-1]!=q):
        x=prior[x-1][q-1]
        mid.append(x)

    print('v_%d'% p,'到v_%d'%q,'的路径为:v_%d'%p,end="")
    for i in mid:
        print('->'+'v_%d'%i,end="")
    print('->'+'v_%d'%(q),":","路程为:",distance_0[p-1][q-1])

谢谢。

posted on 2019-11-21 22:08  小肥鱼~  阅读(178)  评论(0)    收藏  举报