图算法之dijkstra算法(python实现)

以此图为例:
在这里插入图片描述
代码:

print("请输入顶点个数")
vertex_num = int(input())
print("请输入边的条数")
edge_num = int(input())
print("请输入源点")
start = int(input())
print("请依次输入顶点之间路径长度")


fmax = float('inf')
# 初始化邻接矩阵
graph = [[fmax for _ in range(vertex_num)] for _ in range(vertex_num)]
# 初始化源点到各个点的距离数组
dist = [fmax for _ in range(vertex_num)]
# 初始化源点到各个点的路径数组
path = [-1 for _ in range(vertex_num)]
# 用来存放已经确认最短距离的点
T = []
# 创建图
for i in range(edge_num):
    path_list = input().split(" ")
    graph[int(path_list[0])][int(path_list[1])] = int(path_list[2])


def dijkstra(graph, s):
    for i in range(vertex_num):
        # 初始化dist数组
        dist[i] = graph[s][i]
        # 初始化path数组
        if graph[s][i] < fmax:
            path[i] = s
    # 初始化顶点集
    T.append(s)

    while len(T) != vertex_num:  # 如果顶点集T没有满,就一直循环

        temp_num = fmax
        for vertex in range(vertex_num):
            if vertex not in T:  # 如果顶点没被加入到T中,表明从源点到该顶点的最短距离还没确定
                if dist[vertex] < temp_num:
                    temp_num = dist[vertex]
        min_vertex = dist.index(temp_num)
        if min_vertex in T:  # 判断取出的最短距离的点是不是之前已经确认了(针对有路径相同的点)
            min_vertex = dist.index(temp_num, min_vertex+1)  # 如果确认了,就找下一个点
        # 将确认了最短路径的点,加入到顶点集
        T.append(min_vertex)
        # 找min_index的出度点
        for i in range(vertex_num):
            if graph[min_vertex][i] != fmax and i not in T:
                if dist[i] > dist[min_vertex] + graph[min_vertex][i]:
                    dist[i] = dist[min_vertex] + graph[min_vertex][i]
                    path[i] = min_vertex
    return dist, path


dist, path = dijkstra(graph, start)

print("源点到各个点的距离:", end=" ")
print(dist)
print("路径:", end=" ")
print(path)
输入:
请输入顶点个数
5
请输入边的条数
6
请输入源点
0
请依次输入顶点之间路径长度
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
输出:
源点到各个点的距离: [inf, 1, 2, 1, 2]
路径: [-1, 0, 0, 0, 3]
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值