最短路算法模板--SPFA

时间:2023-03-08 23:38:22
最短路算法模板--SPFA

  初见SPFA时,直接认成了优先队列优化的Dijkstra,经过几位大佬的指点,我终于明白了他们的差异。

  Dijkstra是保证已经出队过的点不再入队,SPFA是已经在队列中不再入队。比较起来,SPFA写起来更加方便,空间复杂度相同,时间复杂度,目前我认为差不多的。

  目前正在思考SPFA的正确性(当然是对的,只是我还没有想明白)。

  模板:

    

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int inf=2100000000;
int book[100];
int main()
{
int n,m;
vector<int>u[100];
vector<int>w[100];
cin>>n>>m;
int x,y,z;
for(int i=0;i<m;i++){
cin>>x>>y>>z;
u[x].push_back(y);
u[y].push_back(x);
w[x].push_back(z);
w[y].push_back(z);
} queue<int>q;
q.push(1);
int dis[100];
fill(dis,dis+n+1,inf); dis[1]=0;
book[1]=0;
while(!q.empty()){
int t=q.front();q.pop();
book[t]=0;
for(int i=0;i<u[t].size();i++){
if(dis[u[t][i]]>dis[t]+w[t][i]){
dis[u[t][i]]=dis[t]+w[t][i];
if(!book[u[t][i]]){q.push(u[t][i]);book[u[t][i]]=1;}
}
}
}
for(int i=1;i<=n;i++){
cout<<dis[i]<<endl;
}
}

  不过,弱鸡还是想问一句,那这个算法和队列优化的Bellman-Ford有什么区别?

  恕我直言,这个SPFA除了解决负权边,其他的方面真的比不上Dijkstra。