【问题标题】:Algorithm to find any two nodes with distance of at least half the (undirected) graph's diameter查找距离至少为(无向)图直径一半的任意两个节点的算法
【发布时间】:2020-10-14 07:19:26
【问题描述】:

我必须给出一个算法如下:

给定一个无向连通图 G,给出一个算法,找到两个节点 x,y,使得它们的距离至少是图直径的一半。证明任何主张。

我假设我必须从任意节点运行 BFS 并找到其最远的节点才能找到直径。然后找到两个距离大于直径一半的已探索节点。 但我怀疑这是最优的并要求解决方案。在运行 BFS 查找直径时,是否有其他方法可以同时找到这两个所需节点?所以复杂度仍然是多项式的。 任何指导或提示将不胜感激!

【问题讨论】:

  • 选择任意根并找到距该根最远的节点实际上并不能给出直径。例如考虑直径为 3 的图 A-B-C-D;如果你选择 C ​​作为根,离 C 最远的节点是 A,它离 C 的距离为 2。但是,BFS 仍然是一个好主意; tucuxi 的回答解释了原因。

标签: algorithm graph undirected-graph


【解决方案1】:

图的直径(我们称之为D)是其任何节点之间的最大距离(= 最小跳数)。

选择任何节点并执行 BFS,同时为每个节点保留从初始节点开始的跃点数。这需要 O(V),因为您将只访问所有节点一次。请注意,此 number of hops 也是 shortest 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/2(带有k>=1)。但是,通过x,我们最多可以在2 * (D/2 - k) = D - 2k中找到从任何节点到所有其他节点的路径——因此,图的直径不能是D,而是D - 2k

【讨论】:

  • 谢谢!这更有意义!
【解决方案2】:

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

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

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

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

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

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

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

更复杂的图表并不能改变事实

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


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

【讨论】:

  • 与我的答案相同,但使用图形而非数学证明
  • @tucuxi - 你的证明绝对是证明,我的更像是“应该是这样,因为它是有道理的”:D。但是,我的解释性稍强,这有助于理解这个想法。我认为两者都在这里真的很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多