[小王的学习笔记]SPFA算法

SPFA算法全名shortest path faster algorithm,最短路径更快速算法,它是与Bellman-ford算法进行比较,时间复杂度从O(n^3)或者O(nm)变成O(km),k为每个结点平均入队次数,是一个经验数,一般情况下k为2

由于Bellman-ford算法将会有大规模的冗余比较,所以我们想要尽可能的减少节点入队次数,从而降低复杂度。我们用队列实现,可以用stl自带的queue来实现,也可以用一个int数组,用head和tail指针来控制队列的操作。

算法操作:每次将队首取出来,松弛与它相连的点,如果松弛成功,判断该点是否已经在队列里了,如果在队列里了,我们就没必要入队,如果不在队列里,我们将该点入队。

void spfa(int u0)
{
	memset(dist,63,sizeof(dist)); 
	memset(inq,0,sizeof(inq));
	dist[u0] = 0;
 	queue<int> q;
	q.push(u0);
	inq[u0] = 1;
	while(!q.empty()){
		int u = q.front();
		q.pop();
		inq[u] = 0;
		for(int i = h[u]; i != -1; i = e[i].next){
			int v = e[i].v;
			if(dist[v] > dist[u] + e[i].w){
				dist[v] = dist[u] + e[i].w;
				if(!inq[v]){
					q.push(v);
					inq[v] = 1;
				}
			}
		}
	}
}

这就是SPFA算法的主体,我这里是用的邻接表存图,用邻接矩阵也可以实现,只需要修改一下相关部分的内容。

练习题:
hihoCoder 1093 : 最短路径·三:SPFA算法
luogu P3385 【模板】负环

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值