我给出了一个有向图,其中权重分配给顶点,而不是边。我的目标是在此图中找到路径的最大权重。路径的权重是它包含的所有唯一顶点的权重之和。可以在路径上多次访问顶点,但它只计算一次。
周期可能也可能会出现。
权重是正整数。
重建路径并非必要。
由于图表的大小,它不能表示为邻接矩阵(这可能会对时间复杂度产生影响)。
图表既不强也不弱连接。
示例:
1 -> 20 -> 5
A |
| \/
14 <- 33
最好的路径是
1 -> 20 -> 33 -> 14 -> 1 -> 20 -> 5
与总和73
。
答案 0 :(得分:2)
第一步:消除所有周期。您可以通过选择任何节点并从那里执行DFS来查找循环。如果找不到循环,请找到之前DFS中未访问过的另一个节点,并从该节点执行DFS。如果发现循环将所有节点折叠成单个节点。基本上,如果你到达循环中的任何节点,你将经历循环以获得所有权重。由于您可以重复使用节点和边缘,因此您始终可以像以前一样继续使用路径。找到循环后重复算法,直到折叠完所有循环。
第二步:找到折叠图表中的路径。现在没有循环,所以你可以使用Bellman Ford找到最长的路线(你需要改变条件来寻找更长的路径而不是更短的路径)。因为每个折叠节点都具有循环的重量,所以它代表您获得所需的重量。如果要重建路径,则还需要查看折叠的循环并将其展开到位,注意在循环中添加从输入点到退出点的路径(假设您有一个包含10个节点的循环) ,输入边缘到达节点1,但出口边缘从节点5开始,因此您需要从输入边缘开始添加整个周期1,2,3,4,5 .. 10然后添加周期的一部分带你到出口边缘,在这种情况下1,2,3,4,5)。
复杂度为O(N ^ 2)。 DFS是O(N)(包括在您从当前节点找不到的情况下选择其他节点)以及每次消除至少一个节点(您不能使用单个节点进行循环),因此您将运行它最多N次。 BellmanFord算法也是O(N ^ 2)。重建最多应为O(N)。