我正在尝试在 C++ 中实现 Prim 的 MST 算法。我有一个设计问题
我实现了一个最小堆,它接受一个整数,我们可以提取最小、减少键和插入键。
现在,正如我在 Prim 中所了解的那样,我需要维护每个顶点的权重、邻居信息。我的一些想法是:
1]定义一个结构
struct node {
int vertex;
int weight;
int neighbor;
};
使用最小堆返回具有最小权重的节点。但问题是减少键,因为对于减少键,调用者需要传递他想要减少键的顶点。由于堆交换元素过于频繁,我必须遍历整个列表才能找到顶点,然后减少它的键。这是 O(n),我认为如果我这样做,Prim 会变得更糟。
2] 另一种方法是维护另一个数组,该数组跟踪最小堆队列中顶点的位置。但是在最小堆操作期间跟踪位置会很麻烦。
基本上,如果我必须做减少键(v),如何在基于权重的最小堆队列中找到 v。那么有什么优雅的方法可以做到这一点吗?哪个还能保留复杂性?