最短路算法模板--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。
如需转载,请注明出处
如有侵权,联系删除
2290713181@qq.com
如有侵权,联系删除
2290713181@qq.com