python用弗洛伊德算法寻找最短路径

在这里插入图片描述
左图可得右图的邻接矩阵,将其数据录入二维数组即为下图
在这里插入图片描述
队列矩阵如下图,将数据录入二维数组中
在这里插入图片描述
程序完整代码为

m=float('inf')
r=[[0,1,12,m,m,m],[m,0,9,3,m,m],[m,m,0,m,5,m],[m,m,4,0,13,15],[m,m,m,m,0,4],[m,m,m,m,m,0]]
for i in range(6):
    for j in range(6):
        print(r[i][j],end='\t')
    print()
path=[[0 for i in range(6)] for j in range(6)]


for i in range(6):
    for j in range(6):
        if r[i][j]!=0 and r[i][j]!=m:
            path[i][j]=j


for i in range(6):
    for j in range(6):
        print(path[i][j],end='\t ')
    print()

print('________________________')

for x in range(6):
    for i in range(6):
        for j in range(6):
            if r[i][x]+r[x][j]<r[i][j]:
                r[i][j]=r[i][x]+r[x][j]
                path[i][j]=path[i][x]

print('________________')
for i in range(6):
    for j in range(6):
        print(r[i][j],end='\t ')
    print()

print('___________________')

for i in range(6):
    for j in range(6):
        print(path[i][j],end='\t ')
    print()

运行则可得最终结果
距离矩阵为
图一

队列矩阵为
图二
举个例子,要求结点1到结点5的最短距离和经过的结点,从程序运行结果所得的图一中可知第0行第4列的值为13,即为最短距离,接下来由图二来求得最短距离所经过的结点,因为矩阵的索引值要减一,则1→5即为0→4,在图二中找第0行第4列的值,为1,则路径更新为0→1,再在图中找第1行第4列的值,为3,则路径更新为0→1→3,再在图中找第3行第4列的值,为2,则路径更新为0→1→3→2,再在图中找第2行第4列的值,为4,则路径更新为0→1→3→2→4,因为是索引值,所以将其加一,得1→2→4→3→5

分割线
——————————————————————————
添加了结果查询程序,最终代码如下:

m=float('inf')
r=[[0,1,12,m,m,m],[m,0,9,3,m,m],[m,m,0,m,5,m],[m,m,4,0,13,15],[m,m,m,m,0,4],[m,m,m,m,m,0]]
for i in range(6):
    for j in range(6):
        print(r[i][j],end='\t')
    print()
path=[[0 for i in range(6)] for j in range(6)]


for i in range(6):
    for j in range(6):
        if r[i][j]!=0 and r[i][j]!=m:
            path[i][j]=j


for i in range(6):
    for j in range(6):
        print(path[i][j],end='\t ')
    print()

print('________________________')

for x in range(6):
    for i in range(6):
        for j in range(6):
            if r[i][x]+r[x][j]<r[i][j]:
                r[i][j]=r[i][x]+r[x][j]
                path[i][j]=path[i][x]

print('________________')
for i in range(6):
    for j in range(6):
        print(r[i][j],end='\t ')
    print()

print('___________________')

for i in range(6):
    for j in range(6):
        print(path[i][j],end='\t ')
    print()

##以下为结果查询




a,b=map(int,input('输入起点和终点,用空格分割开,回车键结束:').split(' '))
m,n=a-1,b-1

print(f'最短路径距离为\n{r[m][n]}')

print('l路径为:')
print(f'{m+1}→',end=' ')
while True:
    
    if path[m][n]==n:
        break
    print(f'{path[m][n]+1}→',end=' ')
    m=path[m][n]
    
print(path[m][n]+1)


运行结果如图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值