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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
C++ 如何比较minHeapify中的最小生成树节点?_C++_Algorithm_Graph_Tree_Prims Algorithm - Fatal编程技术网

C++ 如何比较minHeapify中的最小生成树节点?

C++ 如何比较minHeapify中的最小生成树节点?,c++,algorithm,graph,tree,prims-algorithm,C++,Algorithm,Graph,Tree,Prims Algorithm,我正在尝试使用prim的算法创建一个最小生成树,我有一个关于实际堆的主要问题。我将图的邻接列表构造为顶点向量,每个顶点都有一个边向量。边包含权重、连接顶点和关键点。我不确定我的堆是顶点堆还是边堆。如果我让它成为一堆顶点,那么就没有办法确定权重是否来自同一个父顶点和目标顶点,这让我认为我应该为每个顶点的边列表创建一个堆。所以我的最后一个问题是我应该创建一堆边,还是一堆顶点?如果它是一个边列表,我应该使用边上的权重作为键,还是应该有一个单独的名为key的数据成员,我可以实际用于优先级队列?谢谢 堆可

我正在尝试使用prim的算法创建一个最小生成树,我有一个关于实际堆的主要问题。我将图的邻接列表构造为顶点向量,每个顶点都有一个边向量。边包含权重、连接顶点和关键点。我不确定我的堆是顶点堆还是边堆。如果我让它成为一堆顶点,那么就没有办法确定权重是否来自同一个父顶点和目标顶点,这让我认为我应该为每个顶点的边列表创建一个堆。所以我的最后一个问题是我应该创建一堆边,还是一堆顶点?如果它是一个边列表,我应该使用边上的权重作为键,还是应该有一个单独的名为key的数据成员,我可以实际用于优先级队列?谢谢

堆可以是成对的
,并且将包含顶点,这些顶点与已在部分最小生成树中的任何顶点都是一条边。(编辑:在某些情况下,它可能包含已在部分MST中的顶点,当这些元素弹出时,应忽略这些元素)

它可能是一堆边,如
,实际上是相同的,您只需忽略
src
,而
dst
与第一个变量中的
vertex
相同


注:关于
这件事,我认为没有必要使用任何键,你需要比较权重。

你应该做一堆边,因为你要按它们的权重对边排序,但是边应该包含两个顶点:每端代表一个顶点。否则,正如您所建议的:无法确定权重是否来自同一父顶点和目标顶点。因此,您应该重新构造您的edge类,并将它们组成一个小堆

考虑一下来自的算法

使用选定的单个顶点初始化树 从图中任意选择

将树沿一条边生长:一条边中的一条 如果要将树连接到树中尚未存在的顶点,请查找 最小权重边,并将其传递到树

重复步骤2(直到所有顶点都位于树中)


我不完全理解edge类中的键字段。我想这就像一个边缘的Id。因此,您应该为它们创建一个堆,但由于您为堆提供了用户定义的数据结构,因此还应该为edge类提供一个比较函数,即定义
bool操作符堆必须将关键点作为其最小加权边来维护顶点。由于顶点仍然未被访问,因此其任何边都将被取消访问,因此所有未访问边到未访问顶点的最小值将是下一条要添加到跨越的边,因此您将删除与其对应的顶点。这里唯一的问题是,随着生成树在每次迭代中的更改以及新边的添加,将更新的权重保持为堆中顶点的最小边。这样做的方法是保持堆中每个未访问顶点的位置,当一个新顶点添加到生成树时,它的未访问边将使用它们所指向的顶点的直接位置(使用存储的位置)进行更新。然后,如果当前成本小于添加的新边权重,则更新顶点最小成本。然后使用heap的标准过程将其放入堆中,以保持最小堆

数据结构:-

<Vertex,Weight> : Vertex id & weight of minimum edge to it as record of heap

position[Vertex] : The position of vertex record in heap.
:顶点id和作为堆记录的最小边的权重
位置[顶点]:顶点记录在堆中的位置。
注意:内置函数在这里对您没有帮助,因此您需要构建自己的堆以使其高效工作。在开始时将每个顶点的键值初始化为某个无限值

另一种方法:存储指向未访问顶点的所有边,其权重以最小堆为单位。但这需要比其他方法更高的空间复杂度,但具有类似的摊销时间复杂度。提取边时,请检查它所指向的顶点是否已访问,如果已访问,请再次提取并放弃该边