我在这里搜索了如何在定向循环图中找到最长的简单路径(简单的意思是每个节点只访问一次,避免路径无限),并且遇到了像this这样的解决方案。然而,我发现的所有这些解决方案仅显示如何计算最长路径的长度,而不是该路径中涉及的实际节点。如何在有向循环图中找到最长的简单路径(包括所有中间节点)?
因此,我的问题是如何修改像that这样的算法,以便提取最长路径中涉及的节点?类似于Floyd-Warshall所有对最短路径算法可能是modified to allow path reconstruction。
我在这里搜索了如何在定向循环图中找到最长的简单路径(简单的意思是每个节点只访问一次,避免路径无限),并且遇到了像this这样的解决方案。然而,我发现的所有这些解决方案仅显示如何计算最长路径的长度,而不是该路径中涉及的实际节点。如何在有向循环图中找到最长的简单路径(包括所有中间节点)?
因此,我的问题是如何修改像that这样的算法,以便提取最长路径中涉及的节点?类似于Floyd-Warshall所有对最短路径算法可能是modified to allow path reconstruction。
要找到实际的路径,您只需要跟踪最长距离路径(从前辈获得此路径)。 The longest path of vj= the longest path among precedessors U {vj}
方法如下:
v1 > v2 >... > vn
..vj
...vj
)从v1
到vj
最长的距离。然后dist(vj
)= max(dist(u1
)+ 1,dist(u2
)+1,...,dist(uk
)+1)其中u1,u2,...,uk
是vj
的前身。path(vj)=path(ui)U{vj}
其中ui
是最大长度的前身(即我们在dist中选择的那个(vj
))。vj
计算一次。dist(vj)
的最大路径,实际路径为path(vj)
。我想下面的算法可以使用深度优先搜索找到最长的路径。 **之间的事情是DFS算法的变化。
DFS(G)
For each u V[G]
{done(u)=0;
Pre(u)=NULL;}
Time=0;
For each uV[G]
If done(u) == 0
{**longest(u)=0**;
DFS_VISIT(u);}
DFS_VISIT(u)
Done(u)=-1;
Discover(u)=time++;
For each v adjacent to u
If done(v)==0
{ pre(v)=u;
**Longest(v)=longest(u)+1**;
DFS_VISIT(v);}
Done(u)=1;
Finish(u)=time++`
找到毕竟最长的(V),我可以搜索最大的价值,并断定它是最长的路径。你认为@Xline
您链接的问题中接受的答案可以进行简单修改以记录路径及其长度。 – 2014-11-14 14:17:57
@j_random_hacker怎么样?也许这对你来说微不足道,但它不是我的,所以我问了这个问题。 – LogicChains 2014-11-15 01:28:40
什么时候'path'改变了?每当它发生时,也更新路径中的节点列表。什么时候'bestPath'改变?将它重写为if语句:现在,在该语句的主体中,可以在更新其长度的同时更新当前最佳路径中的节点列表。 – 2014-11-15 02:18:29