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 构造一个有效的最小生成树,使得G中给定的顶点子集是叶+;证明_Algorithm_Graph Algorithm_Minimum Spanning Tree_Prims Algorithm_Spanning Tree - Fatal编程技术网

Algorithm 构造一个有效的最小生成树,使得G中给定的顶点子集是叶+;证明

Algorithm 构造一个有效的最小生成树,使得G中给定的顶点子集是叶+;证明,algorithm,graph-algorithm,minimum-spanning-tree,prims-algorithm,spanning-tree,Algorithm,Graph Algorithm,Minimum Spanning Tree,Prims Algorithm,Spanning Tree,我试图设计一个算法,其中,给定一个连通加权图G=(V,E)和V中顶点U的子集,将构造一个最小生成树,使得U中的所有顶点都是叶(其他顶点也可能是叶),或者返回不存在这样的树(False) 这就是我所得到的,采用Prim的算法(公平警告,它真的很糟糕;甚至不知道它是否有效或使用什么数据结构,我会接受任何其他正确的算法): 我也有一张图片,我认为它会对我画的这张图产生什么影响: 证明算法正确也会让我安心。如果所有顶点u∈ U是解决方案中的叶子,该解决方案中不能使用任何U来连接其他两个顶点。所有不在U

我试图设计一个算法,其中,给定一个连通加权图G=(V,E)和V中顶点U的子集,将构造一个最小生成树,使得U中的所有顶点都是叶(其他顶点也可能是叶),或者返回不存在这样的树(False)

这就是我所得到的,采用Prim的算法(公平警告,它真的很糟糕;甚至不知道它是否有效或使用什么数据结构,我会接受任何其他正确的算法):

我也有一张图片,我认为它会对我画的这张图产生什么影响:


证明算法正确也会让我安心。

如果所有顶点
u∈ U
是解决方案中的叶子,该解决方案中不能使用任何U来连接其他两个顶点。所有不在
U
中的顶点必须通过不与任何
U
关联的边连接


删除
U
和与
U
相关的所有边。找到最小生成树,然后用我们移除的最小加权边将每个
u
连接到树上。

次要注释:
让(u,v)是最便宜的边,u在S中,v不在S中
应排除已使用的顶点
u在G中
,否则它们就不会变成树叶。@VincentvanderWeele哦,是的,谢谢。除此之外,你认为这种适应方法有效吗?我认为你的方法和下面的答案都有效。然而,另一种方法的正确性似乎更容易证明。@VincentvanderWeele实际上是对你的次要评论的快速评论(lol):为什么我要排除我已经使用过的顶点u?我已经有一条线,如果一条边(u,v)的节点u在u中,那么该边无论如何都不会被添加到树中。如果U中的节点是v,则可以将此边添加到树中,从而使其成为叶节点。啊,第二行中有另一个If,确保
U
v
不能同时位于
U
。我错过了。我认为这不起作用,特别是“去除所有u形边缘”部分。如果我们这样做,我们可能会得到一个断开连接的图,并且无法找到图中剩余节点的最小生成树。此外,我认为这不是特别有效,尤其是当您将树作为堆存储在优先级队列中时。@iHeartCode124请提供一个非常简单的示例,该示例具有有效的解决方案,这里有一些观察结果说明了为什么这是正确的。1) 从树上移除叶子时,结果仍然是一棵树。因此,如果存在一个包含所有U叶的MSP,那么
V\U
上也存在一个MSP。2) 对于u中的每个
u,将其连接到
V\u
的MSP的边是具有最低重量的边。这是正确的,因为
U
中的两个顶点之间不可能有边(并非所有
U
都是叶子),并且权重不能因矛盾而更高(切换边将生成总权重更低的树)。3) 从前面的两点来看,
V\U
的生成树也必须是一个MSP,这是自相矛盾的。@iHeartCode124(你可能对上面文森特·范德维尔的评论感兴趣。我想我应该提一下,因为他们没有标记你。)
Let x be an arbitrary node in G
Set S = {x}
While S != V:
    Let (u,v) be the cheapest edge with u in S and v not in S
    Add (u,v) to tree T if u is not in U, add v to S

If all u in U is in the tree T:
    return T
Else:
    return False