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])
谢谢。
浙公网安备 33010602011771号