【问题标题】:Applying bfs on a tree to find the longest path between two vertices在树上应用 bfs 以找到两个顶点之间的最长路径
【发布时间】:2013-09-28 09:11:27
【问题描述】:

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

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

1-2

1-3

3-4

3-5

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

【问题讨论】:

  • @Leeor 我想要 BFS 方法来解决这个问题
  • @Leeor 你提供了一个 LCA 问题的链接。是一样的吗?
  • 由于在树上每 2 个顶点都有一条路径,因此每 2 个顶点之间的距离就是到 LCA 的距离之和。

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


【解决方案1】:

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

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

-Bhupesh

【讨论】:

  • Bhupesh- 你的意思是我必须为每个节点创建不同的矩阵?
  • 你的意思是应用 BFS 找出最大连接节点吗?
  • @bhupeshi 猜想如果我使用邻接列表然后为每个节点应用 bfs 并记下它的最大行进距离会简单得多
  • 抱歉回复晚了。是的,您必须为每个节点创建不同的矩阵。由于您不确定这两个节点。如果您确定可以通过将该节点放在首位来做到这一点。例如如果您想知道从给定节点到 3 的最长路径,那么您只需要一个矩阵。这个矩阵应该从 3 开始作为它的第一个元素,以便于顶点导航。
  • 是的,我正在为此使用 BFS。你是对的,你也可以使用列表,但我更喜欢将矩阵用于小型应用程序和测试程序。它也易于使用和理解。一旦你理解了你可以使用任何数据结构来满足你的需要。我记得我在大学时提到的 DS 书之一,yashwant K 的 DS 到 C 有一个与你的问题完全相似的例子。有需要的可以参考。
【解决方案2】:

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

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

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

但我不得不承认,在这一点上,与单纯的 BFS 的区别是相当大的。

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 2018-09-18
    • 1970-01-01
    • 2021-05-25
    • 2011-03-08
    • 2016-10-30
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多