重点:dijkstra算法按层计算其他点到源点的最短距离,层层扩展。node
利用dijkstra算法,能够找到图中源点到其他点的最短距离。而求解两点间最短路径,只需找到两点的最短距离和路径。所以只须要在dijkstra算法中增添一个判断语句便可获得两点间最短距离。python
def dijkstra(adjoin_map, u, v): '''给定一个图的邻接表M,两点u和v,该代码能返回两点间的最短路径和距离。 :param adjoin_map: {node: [(node1, weight), (node2, weight2)]} :param u: :param v: :return: 损失 ''' if u == v: return 0 cost_dct = {u: 0} # 与源点的最短距离 to_visited_set = {u} # 须要访问的集合 find_status = False while not find_status: # 每次迭代扩展一层节点 cur = to_visited_set.pop() for adjoin, cost in adjoin_map[cur]: # 计算最短距离 cost_after = cost_dct[cur] + cost if adjoin in cost_dct.keys(): if cost_after < cost_dct[adjoin]: # 状况1:若是已访问且距离更短,则更新距离 cost_dct[adjoin] = cost_after else: # 状况2:未访问,则加入 cost_dct[adjoin] = cost_after to_visited_set.add(adjoin) if adjoin == v: # 找到则跳出 find_status = True break if v in cost_dct.keys(): return cost_dct[v] return None
若须要保存最短路径,则只须要增长一个字典,用来保存每一个节点的前驱节点。算法