如何在有向循环图中找到最长的简单路径(包括所有中间节点)?

时间:2014-11-14 13:11:00

标签: algorithm graph-algorithm longest-path

我在这里搜索了如何在有向循环图中找到最长的简单路径(简单的意思是每个节点只被访问一次,以避免路径是无限的),并且遇到了{{ {3}}。然而,我发现的所有这些解决方案只显示了如何计算最长路径的长度,而不是该路径中涉及的实际节点。

我的问题是,如何修改像this这样的算法,以便提取最长路径中涉及的节点?类似于Floyd-Warshall全对最短路径算法可能是that

2 个答案:

答案 0 :(得分:1)

要找到实际路径,您只需跟踪最长距离路径(从前任路径获取此路径)。 The longest path of vj= the longest path among precedessors U {vj}

以下是:

  • 进行拓扑排序v1 > v2 >... > vn ..
  • 选择任何顶点vj ...
  • 让dist(vj)成为v1vj的最长距离。然后dist(vj)= max(dist(u1)+ 1,dist(u2)+ 1,...,dist(uk)+ 1)其中u1,u2,...,ukvj
  • 的前身
  • path(vj)=path(ui)U{vj}其中ui是具有最大长度的前身(即我们在dist中选择的那个(vj))。
  • 为每vj计算一次。
  • 最长路径是实际路径dist(vj)的{​​{1}}的最大路径。

答案 1 :(得分:0)

我猜以下算法可以使用深度优先搜索找到最长路径。 **之间的问题是DFS算法的变化。

DFS(G)
  For each u  V[G]
   {done(u)=0;
    Pre(u)=NULL;}
  Time=0;  
  For each uV[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