Graph 为什么有向无环图的最长路径需要拓扑排序?

Graph 为什么有向无环图的最长路径需要拓扑排序?,graph,topological-sort,longest-path,Graph,Topological Sort,Longest Path,问题:给定一个加权有向无环图(DAG)和其中的源顶点s,求出从s到给定图中所有其他顶点的最长距离 请查找参考图: 为什么我们需要拓扑排序?我们不能简单地使用源顶点的修改BFS。为什么我们这么关心线性排序呢 如果这是一个重复,那么请将我重定向到相关的答案 谢谢如果我们不排序,我们不知道首先选择哪个相邻顶点,这可能会导致使用顶点的距离v来更新其相邻顶点的距离adj[v],但在这之后,顶点的距离v会更新,因此adj[v]中的顶点也可以到达更远的距离,但我们不会再去拜访他们了 基于您引用的图表()的示例

问题:给定一个加权有向无环图(DAG)和其中的源顶点s,求出从s到给定图中所有其他顶点的最长距离

请查找参考图:

为什么我们需要拓扑排序?我们不能简单地使用源顶点的修改BFS。为什么我们这么关心线性排序呢

如果这是一个重复,那么请将我重定向到相关的答案


谢谢

如果我们不排序,我们不知道首先选择哪个相邻顶点,这可能会导致使用顶点的距离
v
来更新其相邻顶点的距离
adj[v]
,但在这之后,顶点的距离
v
会更新,因此
adj[v]中的顶点
也可以到达更远的距离,但我们不会再去拜访他们了

基于您引用的图表()的示例:
假设在这一步:

比方说,我们从顶点“0”开始遍历图,然后选择距离
6
的顶点(而不是距离
2
的顶点,如果使用拓扑顺序,我们会选择该顶点)。已处理的顶点为绿色,当前正在处理的顶点为红色:

我们已将最后一个顶点的距离更新为
7
,我们不会增加它,但是,如果我们在上一步中访问了距离
2
的顶点,该顶点的距离将为10:

如果我们能够跟踪访问的节点,应该可以使用递归DFS和一些备忘录

从起始节点开始。对于每个邻居,计算(到邻居的距离+从邻居到目标的距离)。取其中的最大值,将其记为此节点中的最大值,然后返回它


基本上,如果你知道你的邻居到目标的最大距离,你就知道你到目标的最大距离。如果你记忆,你不会访问任何节点超过一次。

如果你知道如何使用“修改的BFS”,那么你可以这样做。顺便说一句,你打算如何使用“改良BFS”

同时,在链接处提出的算法通过首先对图形进行拓扑排序来实现。算法就是这样设计的

现在,拓扑排序顺序由DFS algirithm在回溯阶段生成。不幸的是,DFS会以相反的方向生成拓扑排序顺序。因此,我们不能将最长路径算法的特定处理直接“嵌入”到DFS中。(此算法需要正向处理。)因此,我们必须采用两遍方法:首先进行纯DFS,以构建完整的拓扑排序序列,然后进行第二遍以找到最长路径


在许多实际情况下,基于拓扑排序的算法很有价值,因为DAG的顶点可能已经按拓扑排序的顺序存储。即,在预处理阶段仅进行一次拓扑排序。在这之后,各种基于拓扑排序的算法有效地变成了非常高效的一次通过算法,而无需额外的内存需求(与BFS或DFS等算法相反,它们的堆栈、队列等需要额外的内存)。

如果每次更新时都贪婪地处理节点,则不需要拓扑排序。如果你贪婪地重访所有的邻居,你可以改善最长的距离。例如,在9,您可以检查9+1>7,然后重新访问第7个节点来更新它


但我要澄清的是,大O会变得更糟。如果您首先进行拓扑排序,则可以保证O(V+E)运行时