• 基于bellman-ford算法使用队列优化的spfa求最短路O(m),最坏O(n*m)


    acwing851—spfa求最短路

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    const int N=1e5+10;
    
    int n,m;
    int idx,h[N],ne[N],e[N],w[N],dis[N];
    bool st[N];
    void add(int a,int b,int W)
    {
        e[idx]=b;
        w[idx]=W;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    
    int spfa()
    {
        memset(dis,0x3f,sizeof dis);
        queue<int>que;
        dis[1]=0;
        st[1]=1;
        que.push(1);//bellman-ford算法n次迭代,每次更新m条边。spfa每次更新距离起点最小节点的邻居节点。 
        
        while(que.size())
        {
            auto t=que.front();
            que.pop();
            st[t]=false;
            
            for(int i=h[t];~i;i=ne[i])//节点t的所有临边
            {
                int j=e[i],W=w[i];//j是邻点,W是边权
                if(dis[t]+W<dis[j])//如果邻点到起点的距离能被队列中的节点t更新,更新该邻点,并将该点加入队列(如果当前队列没有该数的话)
                {
                    dis[j]=dis[t]+W;
                    if(!st[j])//注意节点j可能重复进队。
                    {
                        que.push(j);
                        st[j]=1;    
                    }
                    
                }
            }
        }
        if(dis[n]==0x3f3f3f3f)return -1;//本题特殊,说明无负权回路。
        else
            return dis[n];
    }
    
    int main()
    {
        cin>>n>>m;
        memset(h,-1,sizeof h);
        for(int i=0;i<m;i++)
        {
            int a,b,c;cin>>a>>b>>c;
            add(a,b,c);
        }
        
        int t=spfa();
        if(t==-1)cout<<"impossible"<<endl;
        else
            cout<<t;
        
    }
    
  • 相关阅读:
    无参考数据集
    dropout层
    postgresql查询表的大小
    vue 消息订阅与发布
    echarts实现pie自定义标签
    elementUI 时间线居左显示
    css+div实现各种常见边框
    css实现中括号边框
    div中多行内容垂直居中显示
    vue 实现组件全屏展示及退出
  • 原文地址:https://www.cnblogs.com/forward-985/p/13697626.html
Copyright © 2020-2023  润新知