Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找距离至少为(无向)图一半的任意两个节点的算法';s直径_Algorithm_Graph_Undirected Graph - Fatal编程技术网

Algorithm 查找距离至少为(无向)图一半的任意两个节点的算法';s直径

Algorithm 查找距离至少为(无向)图一半的任意两个节点的算法';s直径,algorithm,graph,undirected-graph,Algorithm,Graph,Undirected Graph,我必须给出一个如下的算法: 给出一个无向连通图G,给出一个算法,求出两个节点x,y的距离至少为图直径的一半。证明任何索赔 我假设我必须从任意节点运行BFS,并找到其最远的节点以找到直径。然后找到距离大于直径一半的两个探测节点。 但我怀疑这是最优的,并要求解决方案。在运行BFS查找直径时,是否有其他方法可以同时查找这两个必需的节点?因此,复杂性仍然是多项式的。 任何指导或暗示都将不胜感激 这其实是个棘手的问题,但我想我明白了。有趣的是,你部分错误的解决方案让我走上了正确的道路 让我们在此复制几个定

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

给出一个无向连通图G,给出一个算法,求出两个节点x,y的距离至少为图直径的一半。证明任何索赔

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

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

让我们在此复制几个定义:

  • 图中两个顶点之间的距离是最短路径中的边数
  • 顶点
    v
    的偏心率是
    v
    与任何其他顶点之间的最大距离
  • 图的直径
    d
    是图中任何顶点的最大偏心率。也就是说,
    d
    是任何一对顶点之间的最大距离
真正的问题是找到直径,这不是一项容易的任务。要找到直径,您不能只选择任何节点并运行BFS-在这种情况下,您只需找到距离该节点(偏心率)最大的节点,但它不是直径。要真正找到直径,您必须从每个节点运行BFS(=查找偏心率),获得的最大距离是直径(有一些更好的alghoritms,但正如我所说,这不是简单的任务)

然而!你根本不需要知道直径。如果您实际从随机节点运行BFS,并找到距离(偏心率)最高的节点-这就是算法的解决方案
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仍然是一个好主意;土库锡的回答解释了原因。谢谢!这更有意义!