python最短路径例子_[python]dijkstra 算法的 加权的最短路径 案例

这个还有很多概念有点明确

from collections import defaultdict # defaultdict, 找不到的key的value 就设定为 0,https://blog.csdn.net/edogawachia/article/details/104826952

from heapq import * # heapq 优先队列

def dijkstra_raw(edges, from_node, to_node):

g = defaultdict(list)

for l, r, c in edges:

g[l].append((c, r))

q, seen = [(0, from_node, ())], set()

while q:

(cost, v1, path) = heappop(q)

if v1 not in seen:

seen.add(v1)

path = (v1, path)

if v1 == to_node:

return cost, path

for c, v2 in g.get(v1, ()):

if v2 not in seen:

heappush(q, (cost + c, v2, path))

return float("inf"), []

def dijkstra(edges, from_node, to_node):

len_shortest_path = -1

ret_path = []

length, path_queue = dijkstra_raw(edges, from_node, to_node)

if len(path_queue) > 0:

len_shortest_path = length ## 1. 先求长度

## 2. 分解path_queue,以获得最短路径中的传递节点

left = path_queue[0]

ret_path.append(left) ## 2.1 首先记录目标节点;

right = path_queue[1]

while len(right) > 0:

left = right[0]

ret_path.append(left) ## 2.2 记录其他节点,直到源节点。

right = right[1]

ret_path.reverse() ## 3. 最后反转列表,使其成为正常序列。

return len_shortest_path, ret_path

### ====================给一个所有节点的列表

list_nodes_id = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

### ==================== 给一个拓扑的常数矩阵.

M = 99999 # 这代表一段很长的距离。这意味着没有联系。

### M_topo是表示拓扑的二维邻接矩阵

M_topo = [

[M, 2.9, 2.5, M, 2, M, 1.8, 3, 1.8, M, M, M, M, M, M, M, M, M, M, M, M], # 0

[2.9, M, 1.3, M, M, 1.7, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M], # 1

[1, 1, M, 1, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M], # 2

[M, M, 1, M, 1, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M], # 3

[1, M, M, 1, M, M, M, M, M, 1, 1, 1, M, M, M, M, M, M, M, M, M], # 4

[M, 1, M, M, M, M, 1, M, M, M, M, M, M, M, M, M, M, M, M, M, M], # 5

[1, M, M, M, M, 1, M, 1, M, M, M, M, M, M, M, M, M, M, M, M, M], # 6

[1, M, M, M, M, M, 1, M, 1, M, M, M, M, M, M, M, M, M, M, M, M], # 7

[1, M, M, M, M, M, M, 1, M, 1, M, M, 1, M, M, M, M, M, M, M, M], # 8

[M, M, M, M, 1, M, M, M, 1, M, M, 1, M, M, M, M, M, M, M, M, M], # 9

[M, M, M, M, 1, M, M, M, M, M, M, 1, M, 1, M, M, M, M, M, M, M], # 10

[M, M, M, M, 1, M, M, M, M, 1, 1, M, M, 1, 1, M, M, M, M, M, M], # 11

[M, M, M, M, M, M, M, M, 1, M, M, M, M, M, 1, M, M, M, M, M, M], # 12

[M, M, M, M, M, M, M, M, M, M, 1, 1, M, M, 1, M, M, 1, 1, M, M], # 13

[M, M, M, M, M, M, M, M, M, M, M, 1, 1, 1, M, 1, 1, M, M, M, M], # 14

[M, M, M, M, M, M, M, M, M, M, M, M, M, M, 1, M, 1, M, 1, 1, M], # 15

[M, M, M, M, M, M, M, M, M, M, M, M, M, M, 1, 1, M, M, M, M, 1], # 16

[M, M, M, M, M, M, M, M, M, M, M, M, M, 1, M, M, M, M, 1, M, M], # 17

[M, M, M, M, M, M, M, M, M, M, M, M, M, 1, M, 1, M, 1, M, 1, M], # 18

[M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, 1, M, M, 1, M, 1], # 19

[M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, 1, M, M, 1, M], # 20

]

### --- 读取拓扑,并生成给定拓扑中的所有边。

edges = []

for i in range(len(M_topo)):

for j in range(len(M_topo[0])):

if i != j and M_topo[i][j] != M:

edges.append((i, j, M_topo[i][j])) ### (i,j) 是一个链接;M_topo[i][j]这里是1,链接的长度(i,j).

'''

start = int(input("请输入起始点:"))

end = int(input("请输入终点:"))

print("=== Dijkstra算法 ===")

print("找从 %s 到 %s的最短路径:" % (start, end))

length, Shortest_path = dijkstra(edges, start, end)

print('长度 = ', length)

print('最短路径是 ', Shortest_path)

'''

# what is edge

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值