在树上应用bfs以查找两个顶点之间的最长路径

时间:2013-09-28 09:11:28

标签: c++ data-structures dynamic-programming breadth-first-search

在树中,我必须找到两个顶点,它们之间具有最大数量的顶点(连接),包括它们两者。然后我需要找到它们之间的顶点总数。我想使用广度优先搜索算法来解决这个问题,但没有得到任何线索。如何处理?

示例(对于5个节点) - 树链接为:

1-2

1-3

3-4

3-5

然后最长的路径是 2-1-3-4或2-1-3-5 因此,这条路径总共有4个顶点。

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用邻接矩阵。 我们的想法是为每个节点建立邻接矩阵,使其成为源节点,即在您的示例中为5。 然后导航每个矩阵并找出该节点的最大连接节点。将最大值的跟踪路径放在堆栈中,以备将来使用。 重复此过程,直到覆盖所有矩阵。比较所有矩阵的结果。具有最大值的那个是要选择的那个,并且其在堆栈中的对应值是给定路径。 它也可以使用动态编程来解决。请参阅下面的链接,其中解释了Floyds Warshall算法。请查看使用动态编程找到最短路径的方式。您可以调整其中的一部分,以使用DP找到问题的解决方案。

http://www.youtube.com/watch?v=EMAoMMsA5Jg

-Bhupesh

答案 1 :(得分:0)

由于这是一棵树,从任何源节点运行的BFS只会以源为根返回相同的树(不是通用图,其中BFS可能会忽略在2个节点之间创建较短路径的边想要比较)。

你想要两个最远的顶点,对于任何给定的根,它们可能在不同的分支上(在这种情况下你可以在每个brach上找到最远的叶子),或者它们可以在同一个分支上(在这种情况下你可以继续使用该子树。然而,这涉及一种DP形式,仅略高于BFS。

您可以尝试从任意根运行单个BFS运行,添加回边(每个子指向父),然后将每个分支上找到的最长叶子传播回父级。在路上,计算路上每个子树的最大距离,如果父级由于跨分支距离而有更高的实例可用 - 替换当地最大值

但我必须承认,此时与BFS的差异非常大。