给出一棵树,内容无周期(例如最小生成树:http://fr.wikipedia.org/wiki/Fichier:Minimum_spanning_tree.svg) 如何计算哪个节点最小化树深度(如果它用作根)?找到最小化树深度的根
回答
所有树木都不包含周期。根据定义,树是一个无周期的连通图。如果有一个顶点,答案是微不足道的。所以假设至少有两个顶点。
让ù和v是两个顶点,使得它们的距离d(ü,v)是最大的。应该很容易看出,如果一个选择沿最短UV路径顶点是根,深度将至少天花板(d(ü,v)/ 2)。还应当指出的是,如果一个选择顶点是路径上的根没有,深度将大于天花板(d(ü,v)/ 2)。
假设我们选择了根- [R为沿着最小UV路径,使得d中间顶点(ü,- [R)= 天花板(d(ü,v)/ 2)和d(- [R,v)≤ 天花板(d(u,v)/ 2)。如果有另一个顶点,瓦特,这样d([R,瓦特)>天花板(d(ü,v)/ 2),我们将不得不d(ü,- [R)< d(瓦特,- [R),然后,因为有是在一个树中的任何两个不同的顶点之间只有一个路径,我们有d(ü,v)= d(ü,- [R)+ d(- [R,v)< d(ü,- [R)+ d(- [R,瓦特)= d(ü,瓦特),这与该ù和v有最大的距离。所以,现在的深度,给定- [R为根,是天花板(d(ü,v)/ 2)。
所以我们需要找到距离最远的两个顶点。一旦我们做到这一点,我们可以用最短路径搜索算法UV,注意长度,并遍历中途沿上述路径和使用中的顶点作为根。
我们如何找到这些顶点?选取顶点w并将其放入队列中。当队列非空时,将队列中下一个顶点的邻居添加到队列末尾。当队列为空时,请记下最近移除的顶点。这将是ü。再次执行该程序,您将有诉。
为什么这样吗?上述算法找到距离最远的顶点w。如果瓦特恰好是ü或v,该算法显然没有分别v或ü。因此,假设瓦特既不是ü也不v。如果算法在第一遍中发现了或或v,那么它又会起作用(因为它会在第二遍中找到另一个),所以假设通过相反的方式在第一遍之后找到x,使得它不是树的最大路径的末端。从三角不等式,我们有d(ü,v)≤ d(ü,瓦特)+ d(瓦特,v)和d(v,x)≤ d(v,w)+ d(w,x)。从减去第二,第一,我们有d(ü,v) - d(v,X)≤ d(ü,瓦特) - d (w,x)。然后,我们可以重新安排到d(ü,v)+ d(瓦特,X)≤ d(ü,瓦特)+ d(v,x)。由于d(瓦特,Ú)≤ d(瓦特,X)(X是从瓦特的最大路径的端部; 武不能超过WX )和d(v,x)< d( ü,v)(X不是最大路径的结束),我们可以强化不平等d(ü,v)+ d(瓦特,X)< d(ü,v)+ d(瓦特,x)。但这不可能,所以x必须在最大路径的末尾。
找到树的diameter后选择直径的中间节点作为根。为了找到运行两个BFS的直径,第一个BFS从随机节点v
开始,并从v
找到最远的节点,将其命名为x
,第二个BFS从x
找到最远的节点,其命名为y
。现在x
和y
之间的路径是直径。
@nax,代码的哪一部分,如果你有一个很好的数据结构,你可以简单地使用任何的Web上可用的样本BFS代码。 – 2012-03-31 02:48:47
对不起,我的英文,我的意思是不是来源 – luxcem 2012-03-31 10:03:24
@nax,我的英文不比你好,但你想参考哪个部分?你是否在寻找证据(并不难,最好自己尝试)。但这是一种民间传说和众所周知的问题和解决方案。 – 2012-03-31 21:35:52
我认为下面的算法可能工作(我没有验证它),从图的任何树表示开始。
S = set of all leaves of the tree
foreach node in S: mark(node)
repeat:
# at each iteration, S is the set of all nodes at
# a given min distance to a leave
# initially this distance is 0, then 1, etc.
S' = empty set
foreach node in S:
parent = parent(node)
if !marked(parent): S' += parent; mark(parent)
if S' is empty then S contains all innermost nodes, we are done
S = S' and continue
- 1. 找到树的深度?
- 2. 找到深度的树haskell
- 3. 你会如何找到树的最小深度?
- 4. 找到一个最小化节点深度总和的生成树
- 5. 寻找树的最大深度
- 6. 查找二叉树的最大深度
- 7. 查找树的最大深度
- 8. R:深度最小生成树
- 9. 查找二叉搜索树的最小深度
- 10. 找到bst中最小的深度叶节点
- 11. 大小为1的二叉树的最大深度
- 12. 树结构的最大深度
- 13. B型树的最大深度
- 14. 给定树结构的最大深度
- 15. 二叉查找树的深度
- 16. 如何计算二叉树的最小深度
- 17. Java:二叉搜索的最小深度树递归
- 18. 找到最小递归的二叉树
- 19. 非递归程序找到二叉树的最小高度
- 20. 找到所有的后代深深树结构的根据平面数据
- 21. 角UI树限制最大深度
- 22. 这两个代码找到二叉树的最大深度有什么区别?
- 23. 查找具有最大最小度的生成树
- 24. 如何使用Prolog找到二叉树的深度
- 25. 如何找到深度在列表中记述的二叉树
- 26. 功能找到最深的二叉搜索树总和
- 27. SQL中的树深度
- 28. 确定树的深度
- 29. 使特定节点的程度最小化的最小生成树
- 30. 使用深度优先搜索在树中找到节点
澄清:你问,给定完全连接的无向非循环图,选择距离最近的节点最近的节点? – DRVic 2012-03-30 23:28:36