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。

  • 相关阅读:
    前端vue使用js-xlsx导出excel的三种方法
    vue使用echarts绘制河南地图并实现个人轨迹
    VUE中使用Echarts绘制柱状图
    springboot项目配置拦截器
    springboot+mybatis的多数据源配置
    Java后端高频面试题汇总
    Java基础专题
    Java集合专题
    Java并发专题
    JVM专题javascript:;
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/9113388.html
Copyright © 2011-2022 走看看