POJ 1251 优先队列 Prim

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值