繁体   English   中英

找到距离至少为(无向)图直径一半的任何两个节点的算法

[英]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 rootshortest distance to v from the root - 我将其称为d(root, v)

现在,从根中取出跳数最多的叶子z 恭喜, d(root, z) >= D/2 ,因为

引理:对于直径为D的连通图中的任何节点x ,必须存在一个距离至少D/2远的节点y

证明:如果不是这样,那么会有一些节点x因此对于所有yd(x,y) = D/2 - k <= D/2k>=1 )。 但是,通过通过x ,我们可以找到从任何节点到所有其他节点的路径最多为2 * (D/2 - k) = D - 2k - 因此,图的直径不能是D ,而是D - 2k .

这实际上是一个棘手的问题,但我想我明白了。 有趣的是,您部分错误的解决方案让我走上了正确的道路。

让我们在这里复制几个定义:

  • 图中两个顶点之间的距离是最短路径中的边数
  • 顶点v的偏心率是v与任何其他顶点之间的最大距离
  • 图的直径d是图中任意顶点的最大偏心率。 也就是说, d是任何一对顶点之间的最大距离

真正的问题是实际找到直径,这不是一件容易的事。 要找到直径,您不能只选择任何节点并运行 BFS - 在这种情况下,您只需找到与该节点距离(偏心率)最大的节点,但它不是直径。 要实际找到直径,您必须从每个节点运行 BFS(= 查找偏心率),并且您获得的最高距离是直径(有一些更好的算法,但正如我所说 - 这不是简单的任务)。

然而! 您根本不必知道直径。 如果您实际上从随机节点运行 BFS 并找到距离(偏心率)最高的节点 - 这就是您的算法的解决方案。 x将是您的起始节点, y将是距离最大的节点。

为什么? 如果你想象这样的超级简单的图形

图01

您可以看到直径在节点 1 和节点 4 之间。因此,无论您从哪个点运行 BFS,该点都必须位于中间(这意味着它将具有直径的一半)或不在中间,并且那么距离最大的节点的距离必须比直径的一半还要高。

更复杂的图形也不会改变事实图02

如果您选择 6 或 7,它的直径路径不完全(因为最大距离在 1-2-3-4-5 之间),但这意味着您获得更高的距离,这对您的任务来说很好。


结果:从随机节点运行BFS,当它结束时,取与起始节点距离最大的节点(=找到偏心并记住最远的节点),起始和“结束”节点是(x,y)

暂无
暂无

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

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