图表中最长的路径

时间:2017-12-27 20:24:38

标签: graph-algorithm

给定一个顶点形式为0到n-1的无向图,写一个函数,找到最长的路径(按边数),这些顶点会增加序列。

你会推荐什么样的方法来解决这个难题?

3 个答案:

答案 0 :(得分:5)

您可以将原始图形转换为有向非循环图形,方法是将每条(无向)边缘替换为朝向具有较大数字的节点的有向边缘。

然后你最终得到这个:https://www.geeksforgeeks.org/find-longest-path-directed-acyclic-graph/

答案 1 :(得分:1)

我会做一个动态编程算法。将 L u )表示为从节点 u 开始的最长有效路径。您的基本情况是 L n -1)= [ n -1](即,仅包含节点 n <的路径/ EM> -1)。然后,对于从 n -2到0的所有节点 s ,执行从 s 开始的BFS,其中只允许遍历边( > u v ),以便 v &gt; û。一旦你点击了你已经开始的节点(即节点 u ,你已经计算了 L u )), L s )=从 s u + L ( u )中所有可能的 u &gt; 取值

您的问题的答案是节点 u ,其最大值为 L u ),此算法为O( E ),其中 E 是图表中的边数。我不认为你能比这更快地做得更快

编辑:实际上,“BFS”甚至不是BFS:它只是遍历边缘( s v ),以便 v &gt; s (因为您已经访问了所有节点 v &gt; s ,所以没有遍历:您将立即点击您已经拥有的节点已经开始了)

实际上,简化算法就是这样:

longest_path_increasing_nodes():
    L = Hash Map whose keys are nodes and values are paths (list of nodes)
    L[n-1] = [n-1] # base case
    longest_path = L[n-1]
    for s from n-2 to 0: # recursive case
        L[s] = [s]
        for each edge (s,v):
            if v > s and length([s] + L[v]) > length(L[s]):
                L[s] = [s] + L[v]
        if L[s] > longest_path:
            longest_path = L[s]
    return longest_path

答案 2 :(得分:-1)

有像Dijkastras算法这样的算法可以修改以找到最长而不是最短路径。

这是一个简单的方法:

  • 使用递归算法查找2个节点之间的所有路径。
  • 选择最长路径。

如果您需要有关递归算法的帮助,请询问。