python 单源最短路径

该博客介绍了如何运用Dijkstra算法解决带权有向图中从指定源节点到其他所有节点的最短路径问题。通过Python实现,输入为图的邻接矩阵和源节点,输出为最短路径长度及路径表示。测试样例展示了一个5节点图的最短路径计算过程。
摘要由CSDN通过智能技术生成
'''
带权有向图 G=(V,E) 每条边的权为非负数
给定V中的一个顶点,称为源
计算从源到其他各顶点的最短路长度
'''
import numpy as np
def Dijkstra(n, v, dist, prev, c):
    #s 集合包含已知的最短路径的顶点
    s = np.zeros(n, bool)
    #dist 记录从源到其他顶点的最短路径长度 prev 记录相应的最短路径 c[i][j]表示边(i,j)的权
    s[v] = True
    for i in range(n-1):
        temp = float('inf')
        u = v
        for j in range(n):
            if not s[j] and dist[j] < temp and dist[j] != 0:
                u = j
                temp = dist[j]
        s[u] = True
        for j in range(n):
            if not s[j] and c[u][j] != 0:
                newdist = dist[u] + c[u][j]
                if  newdist< dist[j] or dist[j] == 0:
                    dist[j] = newdist
                    prev[j] = u
    # 输出结果
    for i in range(1, n):
        if dist[i] == 0:
            print("inf: 1", end="")
        else:
            print('{}: 1'.format(dist[i]), end="")
        # 递归函数,因为prev中是从后往前读取节点
        Result(prev, i)
        print("->{}".format(i + 1))

#打印路径
def Result(prev, t):
    if prev[t] != 0:
        Result(prev, prev[t])
        print('->{}'.format(prev[t] + 1), end="")

n = int(input())
c = []
for i in range(n):
    c.append(list(map(int, input().rstrip().split())))
dist = np.array(c[0])
prev = np.zeros(n, int)
Dijkstra(n, 0, dist, prev, c)

测试样例:

输入:

5
0 10 0 30 100
0 0 50 0 0
0 0 0 0 10
0 0 20 0 60
0 0 0 0 0

输出:
10: 1->2
50: 1->4->3
30: 1->4
60: 1->4->3->5

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值