def dijkstra(dg: DirectGraph, s: Vertex): """ 使用 Dijkstra 遍历有向无环图,假设该图为有向无环图 DAG,以下代码不做判断 :param dg: course13.graph.DirectGraph :param s: 寻找DAG中所有顶点到 s 的最短路径 S.P :return: """ if not dg.has_vertex(s): print(dg) raise Exception("顶点: {} 不在 DAG 中") # S 为已经找到最短路径的顶点 # Q 为尚未找到最短路径的顶点 # d 为对应目前迭代中该顶点到 s 的距离 # pai 用于记录在最短路径中,该顶点的上一个顶点 S, Q, d, pai = initialize(dg, s) while Q: # extract-min from Q v, minimize = extract_min(Q, d) if v is not None: S.add(v) Q.remove(v) relax(dg, d, pai, v) else: # 所有可以被 S 达到的顶点都已经被遍历,剩下的顶点无法从 s 到达 break return d, pai
def dijkstra_single_source_single_target(dg: DirectGraph, s: Vertex, t: Vertex): """ 使用 Dijkstra 遍历有向无环图,假设该图为有向无环图 DAG,以下代码不做判断 寻找 DAG 中 s-->t 的最短路径 :param dg: course13.graph.DirectGraph :param s: 寻找DAG中所有顶点到 s 的最短路径 S.P :param t: 目标顶点 :return: """ if not dg.has_vertex(s): print(dg) raise Exception("顶点: {} 不在 DAG 中") # S 为已经找到最短路径的顶点 # Q 为尚未找到最短路径的顶点 # d 为对应目前迭代中该顶点到 s 的距离 # pai 用于记录在最短路径中,该顶点的上一个顶点 S, Q, d, pai = initialize(dg, s) while Q: # extract-min from Q v, minimize = extract_min(Q, d) # 如果 v == t 那么可以停止搜索,已经找到了目标 s-->t 最短路径 if v == t: S.add(v) Q.remove(v) break if v is not None: S.add(v) Q.remove(v) relax(dg, d, pai, v) else: # 所有可以被 S 达到的顶点都已经被遍历,剩下的顶点无法从 s 到达 # 有可能 s-x->t 不存在这样的路径,也就是 d[t] = sys.maxsize break return d, pai