Beispiel #1
0
def initialize(dag: DirectGraph):
    """
    对进行 Floyd 算法求解之前先进行数据的初始化
    :return:
    """
    vexnum = dag.get_vertex_num()
    # Graph 中顶点以 set() 集和存储,这里我们需要将其转化为 list,方便使用下标 index 访问,list 中保存的只是引用,根本上还是 Graph 中 set 的顶点
    vexes = list(
        dag.vertexes)  # 由于是从 set 转化为 list,所以即使是相同的顶点,生成的 list 每次顶点顺序也可能不一样
    # 用于记录最短路径的关系的三维数组 p
    p = [[[False for _ in range(vexnum)] for j in range(vexnum)]
         for i in range(vexnum)]
    # 生成用于记录图中每两个顶点之间的最短路径的二维数组 d[i][j] 代表 vi-->vj 的距离
    d = [[
        dag.get_edge_weight(vexes[i], vexes[j]) if i != j else 0
        for j in range(vexnum)
    ] for i in range(vexnum)]
    for i in range(vexnum):
        for j in range(vexnum):
            if d[i][j] < sys.maxsize:
                p[i][j][i], p[i][j][j] = True, True
    return d, p, vexes, vexnum
Beispiel #2
0
def topology(dag: DirectGraph):
    """
    求 DAG 的拓扑结构
    :param dag:
    :return:
    """
    indegree = initialize(dag)
    # 顶点加入拓扑结构的顺序
    order = []
    vexnum = dag.get_vertex_num()
    while len(order) < vexnum:
        for v, c in indegree.items():
            if c == 0:
                order.append(v)
                # 更新 -1 代表已经加入了拓扑结果
                indegree[v] = -1
                update(dag, v, indegree)
                break
        else:
            # 图中有环,无法计算该图的拓扑结构
            raise CycleException('图中有环,无法计算该图的拓扑结构')
    return order
Beispiel #3
0
def bellman_ford(dg: DirectGraph, s: Vertex):
    """
    使用 Bellman-Ford 寻找图中的最短路径
    :param dg: 有向图,其中图中可以存在 negative-weight cycle,Bellman-Ford 算法可以发现 negative-weight cycle
    :param s: 源点 s
    :return:
    """
    # d 用来记录每个顶点距离 s 的最短路径
    # pai 用于记录每个顶点在最短路径中访问的上一个顶点
    d, pai = initialize(dg, s)
    vertex_num = dg.get_vertex_num()
    # 进行 |V| - 1 次循环
    for _ in range(1, vertex_num):
        # 这里从每个顶点开始遍历每一条边
        for u, l in dg.edges.items():
            for v, w in l:
                relax(u, v, w, d, pai)
    try:
        check(dg, d)
    except NegativeCycleException:
        print("图中存在 negative-weight cycle")
    else:
        print("图中不存在 negative-weight cycle")
    return d, pai