zoukankan      html  css  js  c++  java
  • 最短路算法模板--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。

  • 相关阅读:
    14个你可能不知道的JavaScript调试技巧
    数据库设计四步骤
    mac 卸载 jdk
    node版本管理
    mysql order by limit 问题
    计算机一些基本概念的认识
    SQL设置主外键关联时报错
    阻止表单autocomplete
    常见字符编码
    编程语言分类
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/9113388.html
Copyright © 2011-2022 走看看