算法基础之SPFA求最短路

SPFA求最短路

  • 核心思想:spfa

    • Bellman算法的优化: 当d[j]改变时会影响j的后继 所以需要更新j后继的值 若j不在队列 将其加入队列

    • 若在队列中 标记true 不在 标记false

    •   #include
        #include
        #include
        #include
        
        using namespace std;
        const int N =100010;
        
        int d[N],h[N],e[N],ne[N],w[N],idx;
        int n,m;
        bool st[N];
        
        void add(int a,int b, int c)
        {
            w[idx] = c;
            e[idx] = b;
            ne[idx] = h[a];
            h[a] = idx++;
            
        }
        int spfa()
        {
            memset(d,0x3f,sizeof d);
            d[1] = 0;
            queue<int> q;  //队列存需要操作的节点编号
            q.push(1);
            st[1] = true;
            while(q.size()){
                int t = q.front();
                q.pop();
                st[t] = false;
                
                for(int i = h[t];i!=-1; i = ne[i])
                {
                    int j = e[i];
                    if(d[j] > d[t] + w[i])   //需要更新
                    {
                        d[j] = d[t] + w[i] ;
                        if(!st[j])  //如果队列中没有
                        {
                            q.push(j);  //节点加入队列
                            st[j] = true;  //标记true
                        }
                    }
                }
            }
            if(d[n] == 0x3f3f3f3f) return -2;
            return d[n];
        }
        int main()
        {
            cin>>n>>m;
            
            memset(h, -1, sizeof h);
            
            while(m--)
            {
                int a,b,c;
                cin>>a>>b>>c;
                add(a,b,c);
            }
            
            int t = spfa();
            if(t == -2) puts("impossible");
            else cout<<d[n];
        }
      

你可能感兴趣的:(算法,数据结构,散列表,图论,c++)