基于python的数学建模---图论模型(Dijkstra)
from collections import defaultdict from heapq import * # 堆--先进后出 inf = 99999 # 不连通值 mtx_graph = [[0, 1, inf, 3, inf, inf, inf, inf, inf], [1, 0, 5, inf, 2, inf, inf, inf, inf], [inf, inf, 0, 1, inf, 6, inf, inf, inf], [inf, inf, inf, 0, inf, 7, inf, 9, inf], [inf, 2, 3, inf, 0, 4, 2, inf, 8], [inf, inf, 6, 7, inf, 0, inf, 2, inf], [inf, inf, inf, inf, inf, 1, 0, inf, 3], [inf, inf, inf, inf, inf, inf, 1, 0, 2], [inf, inf, inf, inf, 8, inf, inf, 2, 0]] m_n = len(mtx_graph) # 带权连接矩阵的阶数 edges = [] # 保存连通的两个点之间的距离(点A、点B、距离) for i in range(m_n): for j in range(m_n): # 去除inf和0 if i != j and mtx_graph[i][j] != inf: edges.append((i, j, mtx_graph[i][j])) # edges 就变成了带有数字的元素 def dijkstra(edges, from_node, to_node): global v1, path, cost go_path = [] # range 从0开始 记得后面+1 to_node = to_node - 1 g = defaultdict(list) for l, r, c in edges: # 对应dijkstra方法中的元素 # l:点A r:点B c:距离 # 字典: [点A -> (距离,点B)] g[l].append((c, r)) q, seen = [(0, from_node - 1, ())], set() # set集合-->去重 while q: (cost, v1, path) = heappop(q) # 堆弹出当前路径最小成本 # seen指的是已经到达的地方 if v1 not in seen: seen.add(v1) path = (v1, path) if v1 == to_node: break for c, v2 in g.get(v1, ()): if v2 not in seen: heappush(q, (cost + c, v2, path)) if v1 != to_node: # 无法到达 return float('inf'), [] # 下面是逆序进行 if len(path) > 0: left = path[0] go_path.append(left) right = path[1] while len(right) > 0: left = right[0] go_path.append(left) right = right[1] go_path.reverse() # 逆序变换 for i in range(len(go_path)): # 标号加1 go_path[i] = go_path[i] + 1 return cost, go_path leght, path = dijkstra(edges, 1, 9) print('最短距离为:' + str(leght)) print('前进路径为:' + str(path)
最短距离为:8
前进路径为:[1, 2, 5, 7, 9]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了