老铁们,大家好,相信还有很多朋友对于高效求解最短路径:SPFA算法详解与应用和的相关问题不太懂,没关系,今天就由我来为大家分享分享高效求解最短路径:SPFA算法详解与应用以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
不使用bool st[N]数组也可以,这意味着已经在队列中的点会被再次走一遍,这是多余的,增加了时间,但并没有错。
bool st[N]数组用于判断点是否在队列中,不是是否访问过该点dist[j]=dist[t]+w[i];这一步将j 点的距离更新为1。它是新的最短边。无需在队列中添加与新点对应的最短边。
主要优化是dist[e.b]=min(dist[e.b],last[e.a]+e.c);在贝尔曼福特;在这一步中,并不是所有的边都需要更新,只是last[e.a]变小了。 dist[e.b] 可以变得更小。所以将较小的点添加到队列中,然后当这个点离开队列时,遍历其所有出边并更新一侧,然后将较小的点添加到队列中,直到不再有变化,不再添加到队列中队列。一些新的东西。
#include#include#includeusing 命名空间std;
常量整数N=100010;
int w[N],e[N],ne[N],h[N],idx;
int 距离[N],q[N];
布尔st[N];
整数n,m;
无效添加(int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
int spfa(){
memset(dist,0x3f,sizeof dist);
距离[1]=0;
队列q;
q.push(1);
st[1]=真;
while(q.size()){
int t=q.front();
q.pop();
st[t]=假;
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]dist[t]+w[i]){
距离[j]=距离[t]+w[i];
如果(!st[j]){
q.push(j);
st[j]=真;
}
}
}
}
返回距离[n];
}
int main(){
memset(h,-1,h 的大小);
scanf("%d%d",n,m);
for(int i=0;i
【高效求解最短路径:SPFA算法详解与应用】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于看到了SPFA算法的实现!
有15位网友表示赞同!
以前只听说过SPFA,这次能好好看看代码讲解真棒!
有18位网友表示赞同!
851讲Spfa,感觉应该涵盖很多细节啊!
有13位网友表示赞同!
学习算法总是需要一个个理解和练习,这篇博客就很不错了!
有16位网友表示赞同!
好久没接触数据结构和算法了,这篇文章正好能回顾一下!
有13位网友表示赞同!
最近在刷LeetCode,发现SPFA算法挺常用的,得好好研究一下...
有8位网友表示赞同!
希望文章能够讲解清楚SPFA的原理和步骤,我比较容易理解。
有18位网友表示赞同!
851的博客质量很高,这次也期待这篇Spfa的文章!
有17位网友表示赞同!
学习了Dijkstra算法之后,接下来看看SPFA区别吧!
有5位网友表示赞同!
有图论基础的人应该更容易理解这个算法吧?
有6位网友表示赞同!
看 标题就觉得很专业的样子,厉害了!
有20位网友表示赞同!
SPFA这种动态规划算法,感觉还是挺难的...
有17位网友表示赞同!
这篇文章能教会人们如何用代码实现SPFA吗?
有9位网友表示赞同!
学习算法真是一件需要坚持的事情!
有7位网友表示赞同!
851的文章总是能给我带来灵感和启发!
有20位网友表示赞同!
期待看这篇关于最短路问题的文章,学习一下新的知识!
有16位网友表示赞同!
最近在学习深度学习,感觉数据结构和算法基础也很重要!
有9位网友表示赞同!
SPFA这个名字看起来就很强大啊...
有14位网友表示赞同!
希望这篇文章能帮助我更好的学习算法!
有18位网友表示赞同!