Algorithm 查找距离至少为(无向)图一半的任意两个节点的算法';s直径
我必须给出一个如下的算法: 给出一个无向连通图G,给出一个算法,求出两个节点x,y的距离至少为图直径的一半。证明任何索赔 我假设我必须从任意节点运行BFS,并找到其最远的节点以找到直径。然后找到距离大于直径一半的两个探测节点。 但我怀疑这是最优的,并要求解决方案。在运行BFS查找直径时,是否有其他方法可以同时查找这两个必需的节点?因此,复杂性仍然是多项式的。Algorithm 查找距离至少为(无向)图一半的任意两个节点的算法';s直径,algorithm,graph,undirected-graph,Algorithm,Graph,Undirected Graph,我必须给出一个如下的算法: 给出一个无向连通图G,给出一个算法,求出两个节点x,y的距离至少为图直径的一半。证明任何索赔 我假设我必须从任意节点运行BFS,并找到其最远的节点以找到直径。然后找到距离大于直径一半的两个探测节点。 但我怀疑这是最优的,并要求解决方案。在运行BFS查找直径时,是否有其他方法可以同时查找这两个必需的节点?因此,复杂性仍然是多项式的。 任何指导或暗示都将不胜感激 这其实是个棘手的问题,但我想我明白了。有趣的是,你部分错误的解决方案让我走上了正确的道路 让我们在此复制几个定
任何指导或暗示都将不胜感激 这其实是个棘手的问题,但我想我明白了。有趣的是,你部分错误的解决方案让我走上了正确的道路 让我们在此复制几个定义:
- 图中两个顶点之间的距离是最短路径中的边数
- 顶点
的偏心率是v
与任何其他顶点之间的最大距离v
- 图的直径
是图中任何顶点的最大偏心率。也就是说,d
是任何一对顶点之间的最大距离d
x
将是您的起始节点,y
将是距离最大的节点
为什么??如果你想象这样的超简单图
可以看到直径在节点1和节点4之间。所以不管你从哪个点运行BFS,这个点必须是中间的(这意味着它将有一半的直径)或者不在中间,然后具有最高距离的节点必须具有比半个直径更高的距离。
甚至更复杂的图形也不能改变事实
如果您选择6或7,它的直径路径并不完全相同(因为最大距离在1-2-3-4-5之间),但这意味着您可以获得更高的距离,这对于您的任务来说是很好的
结果:从随机节点运行BFS,当它结束时,从开始节点取距离最大的节点(=找到偏心率并记住最远的节点),开始和“结束”节点是
(x,y)
图的直径(称之为D
)是最大距离(=最小跳数)在其任何节点之间
选择任意节点并执行BFS,同时为每个节点保留初始节点的跳数。这需要O(V),因为您将只访问所有节点一次。请注意,这跳数
也是从根到v的最短距离
——我将其称为d(根,v)
现在,从你的根上取一片跃点数最大的叶子z
。恭喜你,d(root,z)>=d/2,因为
引理:对于直径D
的连通图中的任何节点x
,必须存在至少距离D/2
较远的节点y
证明:如果不是这样,那么会有一些节点x
,因此,对于所有y
,d(x,y)=d/2-k=1
)。但是,通过x
,我们可以找到从任何节点到所有其他节点的路径,最多2*(D/2-k)=D-2k
,因此,图形的直径不能是D
,而是D-2k
,答案与我的相同,但用的是图形而不是数学proof@tucuxi-好吧,你的证明绝对是证明,我的更像是“应该是这样,因为它有意义”:D。然而,我的证明更具解释性,这有助于理解这个想法。我觉得这两样东西都放在这里真是太好了。谢谢你的详细解释!这很有帮助!选择任意根并查找距离该根最远的节点实际上不会给出直径。例如,考虑直径为3的图A-B-C-D;如果选择C作为根,距离C最远的节点是A,距离C为2。但是,BFS仍然是一个好主意;土库锡的回答解释了原因。谢谢!这更有意义!