繁体   English   中英

请建议一些算法来查找树中的节点,该节点与所有节点之间的最远节点的距离最小

[英]Please suggest some algorithm to find the node in a tree whose distance to its farthest node is minimum among all the nodes

请建议一些算法来查找树中的节点,该节点与所有节点之间的最远节点的距离最小。

它不是图表,也没有加权。

在树T中选择任意节点v 运行BFS使v成为T的根。 BFS输出从vT的所有其他节点的距离。

现在选择距离v最远的节点u 再次运行BFS使成为root。 在新的距离输出上,找到距离u最远的节点w

考虑uw之间的路径。 这是树T中最长的路径。 路径中间的节点是树T 的中心

请注意,树中可能存在两个中心。 如果是这样,他们就是邻居。

性能: O(n) ,其中nT的节点数。

证明

声明 :距离某个节点v最远的叶子( u )位于最长的路径上。

如果我们证明它,那么算法是正确的,因为它首先找到 ,并且,因为它是最长路径的一端,所以使用DFS来找到这条路径本身。

索赔的证明:让我们用retucto归谬法。 假设u --- r是树中最长的路径; 而对于一些节点U既不v --- U,也不v --- r是从V的最长路径。 相反,最长的路径是v --- k 我们有两种情况:

a) u --- rv - k有一个共同的节点o 然后v - o - uv - o - ru --- o --- k短。 然后o --- ro --- k短。 然后u --- o --- r不是图中最长的路径,因为u --- o --- k更长。 这与我们的假设相矛盾。

b) u --- rv - k没有共同的节点。 但是,由于图形是连接的,因此在每个路径上都有节点o1o2 ,因此它们之间的路径o1-o2不包含这两个路径上的任何其他节点。 与假设的矛盾与a)中的相同,但是使用o1-o2而不仅仅是o (事实上​​, a点只是b的一个特例,其中o1 = o2 )。

这证明了索赔,因此证明了算法的正确性。

(这是Pavel Shved写的证明,原作者可能会更短)。

去掉叶子。 如果剩下2个以上的节点,请重复。 剩下的节点(或2个节点)将是您要查找的节点。

为什么这样有效:

节点位于树中最长路径P的中间。 它们到任何节点的最大距离最多是路径长度的一半(否则它不会是最长的)。 P上的任何其他节点显然比找到的节点具有到P的另一端的更大距离。 不在P上的任何节点n将至少具有其最远节点(从nP上最近节点的距离,比如c )+(从cP的另一端的距离),所以再次比找到的节点多通过算法。

您可以依次在每个节点上使用Dijkstra算法( http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm )来查找从该节点到每个其他节点的所有距离; 扫描结果列表以获得到最远节点的距离。 一旦你对每个节点进行了Dijkstra,另一次扫描就会给你最小的最大距离。

Dijkstra通常被认为具有运行时O(v^2) ,其中v是节点数; 你将每个节点运行一次,这将在一个简单的实现中增加到O(v^3)的时间。 您可以通过存储早期节点的Dijkstra运行的结果并在以后的运行中将它们用作已知值来获得收益。

您可以将Johnson的算法用于稀疏图,但是否则使用Floyd-Warshall算法只是因为它实现起来很简单。

基本上你想要找到从每个节点到每个其他节点的距离,然后只是简单地搜索你想要的属性。

正如其他人在评论中所说:树是一个图 - 一个确切的无向连通非循环图 - 见“树”(图论)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM