当前位置: 首页 > 知识库问答 >
问题:

为什么线性最短路径算法对无向循环图不起作用?

西门旻
2023-03-14

我已经用Python实现了基本的线性最短路径算法。根据我遇到的各种网站,这只适用于有向无环图,包括this,this和this。然而,我看不出为什么会这样。

def shortestPath(start, end, graph):
    # First, topologically sort the graph, to determine which order to traverse it in
    sorted = toplogicalSort(start, graph)

    # Get ready to store the current weight of each node's path, and their predecessor
    weights = [0] + [float('inf')] * (len(graph) - 1)
    predecessor = [0] * len(graph)

    # Next, relaxes all edges in the order of sorted nodes
    for node in sorted:
        for neighbour in graph[node]:

            # Checks if it would be cheaper to take this path, as opposed to the last path
            if weights[neighbour[0]] > weights[node] + neighbour[1]:

                # If it is, then adjust the weight and predecessor
                weights[neighbour[0]] = weights[node] + neighbour[1]
                predecessor[neighbour[0]] = node

    # Returns the shortest path to the end
    path = [end]
    while path[len(path) - 1] != start:
        path.append(predecessor[path[len(path) - 1]])
    return path[::-1]

编辑:正如Beta所要求的,下面是拓扑排序:

# Toplogically sorts the graph given, starting from the start point given.
def toplogicalSort(start, graph):
    # Runs a DFS on all nodes connected to the starting node in the graph
    def DFS(start):
        for node in graph[start]:
            if not node[0] in checked:
                checked[node[0]] = True
                DFS(node[0])
        finish.append(start)

    # Stores the finish point of all nodes in the graph, and a boolean stating if they have been checked
    finish, checked = [], {}
    DFS(start)

    # Reverses the order of the sort, to get a proper topology; then returns
    return finish[::-1]

共有1个答案

黄昊
2023-03-14

因为您无法用圈对图进行拓扑排序(因此,无向图也是不可能的,因为您无法判断哪个节点应该在另一个节点之前)。

编辑:看了评论后,我想这就是@beta的意思。

 类似资料:
  • 在正加权有向无环图中,我有一个求最短路径的问题,但有最大N步(路径中的边)的限制。假定路径存在。图的另一个性质是,如果边(i,j)在图中,那么对于i 例如,考虑下图。 问题是最多使用k=3步(边)来寻找最短路径。答案是6(路径1->4->5->6)。

  • 主要内容:最短路径算法在给定的图存储结构中,从某一顶点到另一个顶点所经过的多条边称为 路径。 图 1 图存储结构 例如在图 1 所示的图结构中,从顶点 A 到 B 的路径有多条,包括 A-B、A-C-B 和 A-D-B。当我们给图中的每条边赋予相应的权值后,就可以从众多路径中找出总权值最小的一条,这条路径就称为 最短路径。 图 2 无向带权图 以图 2 为例,从顶点 A 到 B 的路径有 3 条,它们各自的总权值是:

  • 我最近一直在研究所有成对最短路径算法,比如Floyd Warshall和Johnson的算法,我注意到这些算法即使在图包含负权重边(但不是负权重圈)时也能产生正确的解。相比之下,Dijkstra的算法(单源最短路径)不适用于负权重边。是什么让全对最短路径算法在负权重下工作?

  • 我有一个有圈的有向图。所有边都是加权的,权重可以是负值。可能会有负循环。

  • 给出了一个边上具有任意权的有向无环图和两个特定结点s和t,其中s的内度和t的外度为0。如何确定成本为正的s到t的最短路径?