Exemplo n.º 1
0
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
Exemplo n.º 2
0
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