关于最短路算法
2021/12/20 9:20:00
本文主要是介绍关于最短路算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
关于我写了一年堆优化的\(SPFA\)这件事
今天我研究为啥\(dij\)不能跑负边权这件事的时候
我的没有每个点只能进队一次的限制,然后我认为堆优化的\(dij\)也是可以跑负边的
于是乎我就懵逼了
后来发现堆优化的\(dij\)每个点只能进队一次,标上\(vis\),只能进一次,也就是说必须保证当前点是距离最小的点
但是有负边权的话,就不能保证是距离最小的点了
于是乎我写的那个可以重复进队,于是是个四不像算法
怪不得我之前分析我自己的最短路复杂度的时候,总感觉多个常数
发现我的最短路,不仅可以重复进队,还没有\(vis\),战神叫它堆优化的\(SPFA\)
记住,\(dij\)每个点只能进队一次保证复杂度,\(SPFA\)每个点在队里就不用新加了
下面放上我的堆优化的\(SPFA\)
code
int dis[N]; struct node{ int x,d; node(){} node(int a,int b){x=a;d=b;} bool operator < (node a)const{ return d>a.d; } }; priority_queue<node> q; void dij(){ memset(dis,0x3f,sizeof(dis)); dis[1]=0;q.push(node(1,0)); while(!q.empty()){ int x=q.top().x;q.pop(); for(int i=head[x];i;i=nxt[i]){ int y=to[i]; // cout<<endl<<"SB"<<" "<<x<<" "<<dis[x]<<" "<<len[i]<<" "<<y<<" "<<dis[y]<<endl; if(dis[y]<=dis[x]+len[i])continue; dis[y]=dis[x]+len[i]; q.push(node(y,dis[y])); } } }
这篇关于关于最短路算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略