![](/img/trans.png)
[英]Linear algorithm to find two points with at least half diameter distance in a point set
[英]Algorithm to find any two nodes with distance of at least half the (undirected) graph's diameter
我必须给出一个算法如下:
给定一个无向连通图 G,给出一个算法,找到两个节点 x,y,使得它们的距离至少是图直径的一半。 证明任何主张。
我假设我必须从任意节点运行 BFS 并找到最远的节点来找到直径。 然后找到两个探索的节点,其距离大于直径的一半。 但我怀疑这是最佳的并要求解决方案。 有没有其他方法可以在运行 BFS 时找到直径,同时找到这两个所需的节点? 这样复杂度仍然是多项式。 任何指导或提示将不胜感激!
图的直径(我们称之为D
)是其任何节点之间的最大距离(= 最小跳数)。
选择任何节点并执行 BFS,同时为每个节点保留初始节点的跳数。 这需要 O(V),因为您将只访问所有节点一次。 请注意,这个number of hops
也是shortest distance to v from the root
的shortest distance to v from the root
- 我将其称为d(root, v)
。
现在,从根中取出跳数最多的叶子z
。 恭喜, d(root, z) >= D/2
,因为
引理:对于直径为D
的连通图中的任何节点x
,必须存在一个距离至少D/2
远的节点y
。
证明:如果不是这样,那么会有一些节点x
因此对于所有y
, d(x,y) = D/2 - k <= D/2
( k>=1
)。 但是,通过通过x
,我们可以找到从任何节点到所有其他节点的路径最多为2 * (D/2 - k) = D - 2k
- 因此,图的直径不能是D
,而是D - 2k
.
这实际上是一个棘手的问题,但我想我明白了。 有趣的是,您部分错误的解决方案让我走上了正确的道路。
让我们在这里复制几个定义:
v
的偏心率是v
与任何其他顶点之间的最大距离d
是图中任意顶点的最大偏心率。 也就是说, d
是任何一对顶点之间的最大距离真正的问题是实际找到直径,这不是一件容易的事。 要找到直径,您不能只选择任何节点并运行 BFS - 在这种情况下,您只需找到与该节点距离(偏心率)最大的节点,但它不是直径。 要实际找到直径,您必须从每个节点运行 BFS(= 查找偏心率),并且您获得的最高距离是直径(有一些更好的算法,但正如我所说 - 这不是简单的任务)。
然而! 您根本不必知道直径。 如果您实际上从随机节点运行 BFS 并找到距离(偏心率)最高的节点 - 这就是您的算法的解决方案。 x
将是您的起始节点, y
将是距离最大的节点。
为什么? 如果你想象这样的超级简单的图形
您可以看到直径在节点 1 和节点 4 之间。因此,无论您从哪个点运行 BFS,该点都必须位于中间(这意味着它将具有直径的一半)或不在中间,并且那么距离最大的节点的距离必须比直径的一半还要高。
如果您选择 6 或 7,它的直径路径不完全(因为最大距离在 1-2-3-4-5 之间),但这意味着您获得更高的距离,这对您的任务来说很好。
结果:从随机节点运行BFS,当它结束时,取与起始节点距离最大的节点(=找到偏心并记住最远的节点),起始和“结束”节点是(x,y)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.