Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在图中找到最长路径?_Algorithm_Data Structures_Graph_Tree_Depth First Search - Fatal编程技术网

Algorithm 如何在图中找到最长路径?

Algorithm 如何在图中找到最长路径?,algorithm,data-structures,graph,tree,depth-first-search,Algorithm,Data Structures,Graph,Tree,Depth First Search,我们得到了表格的邻接列表 U -> (U,V,C) -> (U,V,C) ... U2 -> ... U3 -> ... . . etc (U,V,C)意味着从U到V有一个成本C的优势 给定的邻接列表适用于具有N个节点的单连通树,因此包含N-1条边 给出了一组节点F=F1、F2、F3…Fk 现在的问题是,在F中的节点中找到最长路径的最佳方法是什么? 可以用O(N)来做吗 F中每个节点的DFS是唯一选项吗 我理解你的问题是要求从集合F中找到一对节点,以

我们得到了表格的邻接列表

U -> (U,V,C) -> (U,V,C) ...  
U2 -> ...  
U3 -> ...  
.  
.  
etc
(U,V,C)
意味着从U到V有一个成本C的优势

给定的邻接列表适用于具有N个节点的单连通树,因此包含N-1条边

给出了一组节点
F=F1、F2、F3…Fk

现在的问题是,在F中的节点中找到最长路径的最佳方法是什么? 可以用O(N)来做吗


F中每个节点的DFS是唯一选项吗

我理解你的问题是要求从集合F中找到一对节点,以便这两个节点之间的唯一路径尽可能长。路径是唯一的,因为图形是树

这个问题可以通过从F中的每个节点执行DFS来解决,正如您所提到的,对于O(nk)解决方案,其中n是图的大小,k是集合F的大小


但是,您可以通过分而治之的方法更快地解决它。从图中选取任意节点R,并使用单个DFS将距离Dist(R,a)列成表格,与每个其他节点a,同时将节点划分为子树S1,…,Sm,其中m是距离R的边数;也就是说,这些是挂在根R上的m树。现在,对于属于不同子树的任何f和g,它认为它们之间的路径有Dist(R,f)+Dist(R,g)边,因此可以在O(k^2)时间内搜索最长的路径。此外,您还必须递归到子问题S1,…,Sm,以覆盖最长路径位于其中一棵树内的情况。总体复杂度可以低于O(n k),但数学问题留给读者作为练习。

如果我正确理解了您的问题,您正在尝试在生成树中找到最长的成本路径

对于N的大值,只需2次完全遍历即可找到路径,即O(2N)~O(N)

您应该执行以下步骤

  • 选择生成树中的任意节点
  • 从节点运行任何algo(DFS或BFS),并找到最长的成本 来自此节点的路径 这将不是您通过随机选取节点开始的最长成本路径

  • 从最长成本路径的最后一个节点再次运行BFS或DFS 在步骤2中找到
  • 这一次,你得到的最长成本路径将是最长的成本 生成树中的路径

  • 您不必从每个节点运行DFS。

    DFS=深度优先搜索吗?您似乎要求的是仅由F中的节点组成的最长路径,它必须具有长度==k-1和成本总和(C from(Fi,Fi-1,C))在F上,a的确定顺序为F。这难道不是Euler的Konigsberg桥问题的推广吗?而且,这可能属于数学SE而不是这里。如果每个节点最多有一个后继节点,它在O(n^2)中是微不足道的。如果它是一般图,然后,寻找最长路径是NP完全的,等价于哈密顿路径问题。两个图表将使这一解释更加清楚。它很美,但只有文字让人难以消化。我花了整整5分钟的时间才理解。而且,关于给定算法小于O(nk)的说法不应该留给读者。假设最坏的情况是每个子树有2个f节点,则初始比较为(k^2-k)/4。子树分析为2m(n/m),导致(k^2-k)/4+2n比较,但这假设2个f节点子树是最坏的情况。看起来log(k)f节点实际上是最坏的情况。你能详细说明一下你的断言是O(nk)吗?这在无向生成树的情况下总是正确的,因为当你随机选取一个节点进行遍历时,你不确定起点是否会引导你走最长的路径。当您第一次运行algo时,您将遍历最长的路径,只剩下一个场景,而实际最长的路径不涉及您最初拾取的节点。因此,当您再次运行algo时,它肯定会为您提供最长的路径。在这两种情况下,如果最长路径涉及您首先拾取的节点,或者甚至不涉及该节点。试着在一个用例上运行它,你肯定会理解的。如果每个节点都属于F,但每个节点都不属于F,那么这肯定是有意义的。这可能是一种很好的方法,但你可能需要解决这个问题。(或者我遗漏了什么,如果有,请告诉我。)@Jaredoguen是的,如果每个节点都属于集合F。如问题中所述,它提到有N个节点和N-1条边,并且没有循环,因此我假设每个节点都连接到一棵树。给定结构是一棵树,但并非所有节点都感兴趣(即,在F中)。