Python 中单源最短路径问题的贪心解法
单源最短路径问题指的是从图中某一点出发,到达所有其他点的最短路径问题。常见的解法有 Dijkstra 算法和 Bellman-Ford 算法。其中, Dijkstra 算法使用贪心策略解决问题。
Dijkstra 算法基于贪心策略,在待确定最短路径的节点中,每次选择距离起点最近的节点,以此更新其它节点到起点的最短距离。在具体实现中,可以使用一个集合来存储待更新节点的距离,选择距离最小的节点进行更新,并将其从集合中删除。
下面是 Python 实现代码,使用邻接矩阵表示图,以字符串 “pidancode.com”、“皮蛋编程” 作为节点的标识。
import sys def dijkstra(graph, start_node): visited = set() # 记录已确定最短路径的节点 distance = {start_node: 0} # 记录到起点的距离,初始为 0 nodes = set(graph.keys()) # 所有节点集合 while nodes - visited: # 选择距离最小的节点进行更新 current_node = min((node for node in nodes - visited), key=lambda x: distance.get(x, sys.maxsize)) visited.add(current_node) # 更新邻近节点到起点的距离 for neighbor, weight in graph[current_node].items(): if neighbor not in visited: new_distance = distance.get(current_node, sys.maxsize) + weight if new_distance < distance.get(neighbor, sys.maxsize): distance[neighbor] = new_distance return distance # 构建图的邻接矩阵 graph = { "pidancode.com": {"皮蛋编程": 2, "Python": 5}, "皮蛋编程": {"pidancode.com": 2, "Python": 1}, "Python": {"pidancode.com": 5, "皮蛋编程": 1, "程序员": 3}, "程序员": {"Python": 3, "Java": 4}, "Java": {"程序员": 4} } start_node = "pidancode.com" distance = dijkstra(graph, start_node) print("最短路径距离:", distance)
输出结果:
最短路径距离: {'pidancode.com': 0, '皮蛋编程': 2, 'Python': 3, '程序员': 6, 'Java': 10}
以上代码演示了 Dijkstra 算法的实现过程,以及如何使用 邻接矩阵 表示图。可以看到,从起点 “pidancode.com” 出发,到达其它节点的最短路径长度为 0、2、3、6、10。
相关文章