最短路算法模板--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。

posted @ 2018-05-30 21:07  断腿三郎  阅读(125)  评论(0编辑  收藏  举报