使用BFS / DFS查找树的直径的算法。为什么行得通?


28

链接提供了一种使用BFS / DFS查找无向树的直径的算法。总结:

在图中的任何节点上运行BFS,记住您最后发现的节点。记住最后发现的节点v,从u运行BFS。d(u,v)是树的直径。

为什么行得通?

第2页,提供了一个理由,但它是混淆。我引用了证明的初始部分:

在图中的任何节点上运行BFS,记住您最后发现的节点。记住最后发现的节点v,从u运行BFS。d(u,v)是树的直径。

正确性:令a和b为任意两个节点,使得d(a,b)是树的直径。从a到b有一条独特的路径。令t为BFS在该路径上发现的第一个节点。如果从s到u 的路径p1和从a到b的p2路径不共享边,则从t到u的路径包括s。所以

d(t,u)d(s,u)

d(t,u)d(s,a)

....(更多不平等现象随之而来。)

不平等对我来说没有意义。


我在链接的问题中找不到报价。
拉斐尔

1
尝试在解决方案中将“不共享边”替换为“不共享顶点”。
Yuval Filmus 2014年

您仅使用BFS,而不使用DFS。
缩略图

Answers:


11

证明要求的所有部分都取决于具有无向边的树木的2个关键特性:

  • 1个连通性(即,树中任意两个节点之间只有一条路径)
  • 任何节点都可以充当树的根。

选择一个任意树节点。假设ü v V G ^ 与节点d Û v = ð ģ 。进一步,该算法找到节点假设X在开始小号第一,一些节点ÿ起始于X下。wlog d 小号Û d 小号v 。注意su,vV(G)d(u,v)=diam(G)xsyxd(s,u)d(s,v)必须持有,除非该算法的第一阶段将不会在最终 X。我们将看到 d x y = d u v d(s,x)d(s,y)xd(x,y)=d(u,v)

在以下伪图形中可以看到所有涉及的节点的最一般的配置(可能是s = z x y或两者都有):s=zuvs=zxy

(u)                                            (x)
  \                                            /
   \                                          /
    \                                        /
     ( z_uv )---------( s )----------( z_xy )
    /                                        \
   /                                          \
  /                                            \
(v)                                            (y)

我们知道:

  1. 。否则, d u v < d i a m G 与假设相反。d(zuv,y)d(zuv,v)d(u,v)<diam(G)
  2. 。否则, d u v < d i a m G 与假设相反。d(zuv,x)d(zuv,u)d(u,v)<diam(G)
  3. ,否则该算法的阶段1中将不会停在 Xd(s,zxy)+d(zxy,x)d(s,zuv)+d(zuv,u)x
  4. ,否则该算法的阶段2不会在停止 ÿd(zxy,y)d(v,zuv)+d(zuv,zxy)y

1)和2)暗示 d(u,v)=d(zuv,v)+d(zuv,u)d(zuv,x)+d(zuv,y)=d(x,y)+2d(zuv,zxy)d(x,y)

3)和4)暗示 d(zxy,y)+d(s,zxy)+d(zxy,x)d(s,zuv)+d(zuv,u)+d(v,zuv)+d(zuv,zxy) 相当于 d(x,y)=d(zxy,y)+d(zxy,x)2d(s,zuv)+d(v,zuv)+d(u,zuv)d(u,v)

因此d(u,v)=d(x,y)

模拟证明适用于其他配置

                 (u)                          (x)
                   \                          /
                    \                        /
                     \                      /
     ( s )---------( z_uv )----------( z_xy )
                     /                      \
                    /                        \
                   /                          \
                 (v)                          (y)

                          (x)        (u)  
                          /            \  
                         /              \ 
                        /                \
     ( s )---------( z_xy )----------( z_uv )
                        \                /          
                         \              /           
                          \            /            
                          (y)        (v)            

这些都是可能的配置。特别是,由于算法和的阶段1的结果ÿ p 一个ħ X Û ÿ p 一个ħ X v 由于第2阶段。xpath(s,u),xpath(s,v)ypath(x,u),ypath(x,v)


(1)关于第一个图形,从s到x的路径是否不应该总是以某种顺序包含顶点u和v,因为它们存在于BFS生成的树上?(2)您能否阐明不平等是如何得到的?(3)由于从s开头的BFS和从x开头的BFS在路径上的某处包含u,v,因此我相信该图形应如链接imgur.com/jQ94erY所示。您提供的推理在这里如何应用?
咖喱饭

@curryage注意,树是由bfs给出的,而不是由bfs构造的!具体答案:广告1)否。想象通过在边缘上任意添加许多节点并在边缘z x yx 上精确添加1个节点来对图形(1)中的树进行细化。然后,第一阶段bfs将以x结尾。广告2)不清楚哪些不平等?我们总是假设u v 是图的直径d a a g G 的长度的路径(s,zxy)(zxy,x)(u,v)diag(G)。由于G是1连接的,因此定义明确。广告3)否:3.1除之外,任意2个节点之间都有多于1条路径,因此该图不是树。...(s,y)
collapsar 2014年

@curryage ... 3.2 ; 这是不可能的,因为假设d u v = d i a m G ,并且图的直径是任意两个节点之间的最大最小距离。在树的情况下,任意两个节点之间恰好有1条路径,因此定义简化为“任意两个节点之间的最大距离”。d(x,y)>d(u,v)d(u,v)=diam(G)
collapsar 2014年

9

背后的直觉很容易理解。假设我必须找到给定树中任何两个节点之间存在的最长路径。

在绘制了一些图之后,我们可以观察到最长的路径将始终出现在两个叶节点(只有一个边链接的节点)之间。这也可以通过矛盾证明,如果最长的路径在两个节点之间,并且两个节点中的一个或两个都不是叶节点,那么我们可以扩展路径以获得更长的路径。

因此,一种方法是首先检查哪些节点是叶节点,然后从其中一个叶节点启动BFS,以使其距离节点最远。

与其先发现哪些节点是叶节点,不如从一个随机节点开始BFS,然后查看哪个节点距离它最远。让最远的节点为x。显然,x是叶节点。现在,如果我们从x开始BFS并检查距离它最远的节点,我们将得到答案。

但是,如何保证x将成为最大路径的终点?

让我们看一个例子:

       1   
    / /\ \
   6 2  4 8
         \ \
          5 9
           \
            7

假设我从6开始创建BFS。距离6最大距离的节点是节点7。使用BFS,我们可以获得该节点。现在,我们从节点7开始对BFS进行标记,以在最大距离处获得节点9。从节点7到节点9的路径显然是最长的路径。

如果从节点6开始的BFS给2作为最大距离节点,该怎么办。然后,当我们从2开始BFS时,我们将在最大距离处得到7作为节点,并且最长路径将是长度为4的2-> 1-> 4-> 5-> 7,但是实际的最长路径长度是5。这不能发生这种情况是因为来自节点6的BFS永远不会将节点2作为最大距离的节点。

希望能有所帮助。


1
多数民众赞成在一个简单而明确的解释!谢谢:)
anekix

4

这是一个更紧密地遵循原始问题中所链接的MIT解决方案集的证明。为了清楚起见,我将使用与它们相同的符号,以便可以更轻松地进行比较。

ababp(a,b)d(a,b)sa,bs=abud(s,u)=maxxd(s,x)

引理0:和均为叶节点。ab

证明:如果它们不是叶节点,则可以通过将端点扩展到叶节点来增加,这与是直径相反。d(a,b)d(a,b)

引理1:。max[d(s,a),d(s,b)]=d(s,u)

证明:为了矛盾起见,假设和都严格小于。我们来看两种情况:d(s,a)d(s,b)d(s,u)

情况1:路径不包含顶点。在这种情况下,不能为直径。要知道为什么,让为与距离最小的唯一顶点。然后,我们看到,因为。类似地,我们还将具有。这与是直径矛盾。p(a,b)sd(a,b)tp(a,b)sd(a,u)=d(a,t)+d(t,s)+d(s,u)>d(a,b)=d(a,t)+d(t,b)d(s,u)>d(s,b)=d(s,t)+d(t,b)>d(t,b)d(b,u)>d(a,b)d(a,b)

情况2:路径包含顶点。在这种情况下,再次不能是直径,因为对于某些顶点,使得,和大于。p(a,b)sd(a,b) ud(s,u)=maxxd(s,x)d(a,u)d(b,u)d(a,b)

引理1给出了为什么我们从第一个BFS 的最后发现的顶点开始第二个广度优先搜索的原因。如果是与的最大距离的唯一顶点,那么根据引理1,它必须是某个路径的端点之一,且距离等于直径,因此,以为根的第二BFS 无疑会找到直径。另一方面,如果至少还有一个顶点使得,那么我们知道直径为,无论我们是从还是开始第二个BFS都没有关系。û š ù v d 小号v = d 小号Û d b = 2 d 小号Û ü vuusuvd(s,v)=d(s,u)d(a,b)=2d(s,u)uv


太棒了 感谢您发布此答案。我很惊讶这个答案没有得到任何支持。
Zephyr

0

首先从随机节点运行DFS,然后树的直径是其DFS子树中节点最深叶子之间的路径: 在此处输入图片说明


4
为什么这样做?
Yuval Filmus

0

根据BFS的定义,探索的每个节点的距离(与起始节点的距离)等于先前探索的节点的距离,或者等于或大于1。因此,BFS探索的最后一个节点将位于距离起点最远的节点之中。节点。

因此,使用BFS两次达的算法“选取的任意节点。找到节点从最远(最后一个节点发现通过BFS从开始)。找到节点从最远(发现通过BFS从开始最后一个节点)。”,从而找到彼此之间最大距离的两个节点。xaxxbaa


1
感谢您凭直觉回答。但是,您最后一句话中的“因此”并不明显。为什么会这样?为什么距离最远的节点必须是彼此最大距离的两个节点之一?似乎需要一些证据。x
DW

我不确定如何构造这样的证明。我感觉相反的说法是直觉上正确的:如果两个节点彼此之间的距离最大,那么对于任何给定的节点,两个节点之一距离它的最大距离。
Extrarius

对于一般图形,“直觉上正确”的主张通常并不正确。参见cs.stackexchange.com/a/213/755中的图表,并想象从节点启动BFS (即,让);然后它会挑选和查找节点在从最大距离,但在不脱离彼此找到最大距离的两个节点。因此,声明的语句(如果为true)必须依赖于某些树的特殊属性,而这些树对于常规图形而言并不成立。x = v a = u b avx=va=uba
DW

是的,但是这个问题指定了无向树,这就是我所要了解的上下文。禁止循环和有向边使许多图形问题变得更容易推论。
Extrarius

0

要知道的一件事是,一棵树总是平面的,这意味着它可以放在平面上,因此通常二维思维是可行的。在这种情况下,算法会说从任何地方开始,并尽可能远。从该点到您可以远离该点的距离是树中最长的距离,因此是直径。

如果我们将其定义为完全包围该岛的最小​​圆的直径,则该方法也可以找到真实的物理岛的直径。


0

@op,在PDF中定义案例的方式可能有点偏离。

我认为这两种情况应该是:

  1. p1不与相交,即,路径和之间没有公共顶点。在这种情况下,将定义为第一个BFS在处发现的上的第一个节点。p2p1p2tp2s

  2. p1和具有至少一个公共顶点。在这种情况下,将定义为第一个BFS在上发现的上的第一个节点。p2tp2p1

PDF中的其余证明都应遵循。

有了这个定义,OP所显示的数字就属于案例2。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.