dijkstra + heap 优化

本文探讨了在正边存在的图中,为何优先选择Dijkstra算法配合堆优化的原因。相较于Bellman-Ford算法,Dijkstra算法结合堆优化能更有效地找到最短路径,尤其是在存在负环的情况下。详细介绍了Dijkstra算法的基本思想、优化策略以及堆优化的实现细节,包括如何处理堆中节点的更新和避免复杂度增加的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spfa和bellman-ford复杂度是同阶的。虽然据说spfa复杂度是O(K*E)(k为某个常数,2~3),但是最坏情况下为O(N*E),卡spfa的题目无法通过。

所以有正边的时候最好用dikstra+heap优化,并且有priority queue代码量不会很大


1.bellman-ford算法:

bellman-ford算法的核心是松弛操作:

用一个while(true)循环;不断检测对于每条边,可以不可以进行松弛操作,如果没有一条边可以进行松弛操作,则退出循环。在没有负边的时候,松弛操作一定是有限的,故最后一定会退出循环。

如果图中不存在负环,那么最短路就不会经过同一个顶点两次

代码

sturct edge{ int from,to,cost; };
edge es[maxn];
int dis[maxn];
int V,E;

void BellmanFord(int s){
	for(int i=0;i<V;i++) dis[i]=INF;
	dis[s]=0;
	while(true){
		bool update = false;
		for(int i=0;i<E;i++){
		edge cur=es[i];
		if(dis[e.from]!=INF && dis[e.to]>dis[from]+e.cost){
				dis[e.to]=dis[e.from]+e.cost;
				update=true;
			}
		}
		if(!update) break;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值