Prim 算法是每次都将未加入到结合V 中,并且边是最短的点加入到 V 中,从而最终形成最小生成树。这里可以使用优先队列进行算法的优化。
这里的结构体里 v, next, w的 v是起点,w是权值,而next是head 的索引值,而head 是每次都更新的值,在使用 Prim 做更新的时候就不用像原来那样逐个遍历,而是使用head索引来依次查找。
这里在搜索的时候,不是像之前使用Prim那样逐次找出最小的,那样的时间复杂度是 O(n),而是每次都与dis数组比较,小的话就加入到队列中,并且更新dis,直到队列搜索为空的时候才终止。
而Prim算法的性能是取决于优先队列是如何实现的,可以利用二叉最小堆或者是斐波那契堆来实现,这样速度会快一下。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#define NLEN 2000
#define INF 0x3fffffff
int cnt;
int head[NLEN];
typedef struct Node {
int v, next;
int w;
bool operator < (const Node &a) const {
return w > a.w;
}
}Node;
Node p[NLEN];
Node t1, t2;
void addEdge(int u, int v, int w) {
p[cnt].v = v;
p[cnt].next = head[u];
p[cnt].w = w;
head[u] = cnt++;
}
void p