寻找树的中心

时间:2010-10-26 01:48:34

标签: algorithm tree graph-theory

我有一个问题,这是我的计划的一部分。

对于树T =(V,E),我们需要在树中找到节点v,该节点v最小化从v到任何其他节点的最长路径的长度。

那么我们如何找到树的中心?是否只能有一个中心或更多?

如果有人能为我提供良好的算法,那么我就可以了解如何融入我的计划。

3 个答案:

答案 0 :(得分:5)

考虑一个有两个节点的树?哪个是中心?任何一个都足够了,一棵树可以有一个以上的中心。

现在,想想成为中心意味着什么。如果所有分支都是相同的高度,则中心是根(所有路径都通过根)。如果分支具有不同的高度,那么中心必须是根或在具有最大高度的分支中,否则最大路径大于最高分支的高度,并且根将是更好的选择。现在,我们需要看最高的分支到底有多远?最高分支(从根部)到下一个最高分支之间的高度差异的一半(如果差异最多为1根则足够)。为什么,因为当我们沿着最高的分支向下移动一级时,我们将通向下一个最高分支的最深节点的路径延长一个,并将到当前分支中最深节点的距离减少一个。最终,当你穿过深度差异的一半时,它们将是平等的。现在,当我们走下最高的分支时,我们只需要在每个级别选择最高的子分支。如果多个具有相同的高度,我们只需任意选择一个。

基本上,您正在做的是找到图中最长的路径,即树的最高分支与下一个最高分支之间的距离,然后找到该分支上的中间节点。因为可能存在与最长路径长度相同的多条路径,并且最长路径的长度可能是偶数,所以您有多个可能的中心。

答案 1 :(得分:5)

有两种方法可以做到这一点(两者都在同一时间运行):

  • 使用BFS(我将在此处描述)
  • 使用FIFO queue

选择树上的任何顶点v1。从此顶点运行BFS。您将要进行的最后一个顶点(v2)将是距离v1最远的顶点。现在运行另一个BFS,这次是从顶点v2获取最后一个顶点v3

v2v3的路径是树的直径,你的中心位于它的某个位置。更准确地说,它位于它的中间。如果路径有2n + 1个点,则只有一个中心(位置n + 1)。如果路径有2n个点,则nn + 1位置将有两个中心。

您只能使用2个在2 * O(V)时间内运行的BFS呼叫。

答案 2 :(得分:3)

而不是为你做这个家庭作业问题,我会问你通过思考过程得到答案......

1)你会对图a-b-c做什么(三个顶点,两个边,绝对是非循环的)?想象一下你必须在一些顶点上放置一些标签,你知道你将获得“中心”顶点上最小的最长路径。 (b,最终标签为“1”)但是,一步完成这一过程需要精神力量。所以问问自己b是一步之遥。如果b的最长路径是1,而我们刚刚沿着那条路径向后走了一步,到目前为止我们路径的长度是多少? (最长路径= 1,后退一步为-1.Aha:0)。所以那必须是树叶的标签。

2)这表明算法的第一次切割是什么意思?将叶子标记为“0”,将其上游标记为“1”,将其上游标记为“2”,依此类推。从树叶进入并计算距离......

3)嗯......我们对图a-b-c-d有问题。 (从现在开始,标记的顶点将被其标签替换。)标记叶子“0”给出0-bc-0 ...我们不能得到两个中心......哎呀,我们怎么做才更简单条件0-b-1?我们想用“1”和“2”标记b ......按相反的顺序处理那些......

在0-b-1中,如果我们将路径从b的左边延伸一,我们得到一条长度为1的路径。如果我们从b的右边扩展路径,我们得到2.我们想跟踪“从v到任何其他节点的最长路径“,所以我们想要跟踪到b的最长路径。这意味着我们用“2”标记b。

 0-b-1  ->  0-2-1 

在0-b-c-0中,计算机实际上并不同时更新b和c。它更新其中一个,给出0-1-c-0或0-b-1-0,下一个更新给出0-1-2-0或0-2-1-0。 b和c都是该图的“中心”,因为它们中的每一个都满足要求“树中的节点v,其最小化从v到任何其他节点的最长路径的长度”。 (那个长度是2。)

这导致另一个观察结果:计算的结果不是标记图形,而是找到我们标记的最后一个顶点和/或以最大标签结束的顶点。 (有可能我们找不到订购标签的好方法,所以我们最终需要在最后找到最大值。或者我们愿意。谁知道。)

4)所以现在我们有类似的东西:制作图表的两个副本 - 标签副本和刻录副本。第一个将存储标签,它将是最终答案。当我们从中删除未标记的顶点(以查找新的可标记顶点)时,刻录副本将变得越来越小。 (还有其他方法来组织这个,以便只使用一个图形副本。当你完全理解这个答案时,你应该找到一种方法来减少这种浪费。)大纲:

    label = 0
    while the burndown graph is nonempty
        collect all the leaves in the burndown-graph into the set X
        for each leaf in the set X
            if the leaf does not have a label
                set the leaf's label (to the current value of label)
            delete the leaf from the burn-down graph (these leafs are two copies of the same leaf in the input graph)
        label = label+1
    find the vertex with the largest label and return it

5)如果你真的看到这次跑步,你会注意到短暂切割的几个机会。包括用更快的识别答案的方法替换大纲最后一行的搜索。

现在有关算法问题的一般策略提示:
*手工做一些小例子。如果您不了解如何处理小案例,则无法直接跳入并告诉计算机如何处理大案例。 *如果上述任何步骤似乎没有动力或完全不透明,那么你需要学习很多,更难以在计算机科学中取得好成绩。可能是计算机科学不适合你...

相关问题