zoukankan      html  css  js  c++  java
  • 图论浅析--最短路之SPFA

    SPFA

    SPFA即Shortest Path Faster Algorithm,求单源最短路。
    在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作。
    松弛操作必定只会发生在最短路径前导节点松弛成功过的节点上,用一个队列记录松弛过的节点,可以避免了冗余计算。复杂度可以降低到O(kE)。(注:一般k<=2,也可能很大)

    Code

    struct Edge
    {
        int v;
        int cost;
    };
    vector<Edge>E[NUM];
    int n;
    bool vis[NUM];//在队列标志
    int cnt[NUM];//每个点的入队列次数,用来判定是否存在负环回路
    int dist[NUM];
    queue<int>q;
    
    void addedge(int u,int v,int w)
    {
        E[u].push_back(Edge(v,w));
    }
    
    bool SPFA(int start)
    {
        memset(vis,false,sizeof(vis));
        memset(cnt,0,sizeof(cnt));
        for(int i=1;i<=n;i++) dist[i]=INF;
        while(!q.empty())q.pop();
        dist[start]=0;
        vis[start]=true;
    
        q.push(start);
        cnt[start]=1;
        while(!q.empty())
        {
            int u=q.front(); q.pop();
            vis[u]=false;
            for(int i=0;i<E[u].size();i++)
            {
                int v=E[u][i].v;
                if(dist[v]>dist[u]+E[u][i].cost)
                {
                    dist[v]=dist[u]+E[u][i].cost;
                    if(!vis[v])
                    {
                        q.push(v);
                        vis[v]=true;
                        if(++cnt[v]>n) return false;
                    }
                }
            }
        }
        return true;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    树---数据结构
    B+树索引
    对大文件排序
    快速拍粗和冒泡排序
    TCp
    TCP通信粘包问题分析和解决(全)(转)
    linkhashmap实现原理
    spring中用到的设计模式
    linux查看进程和线程的命令
    Shell编程入门(第二版)(中)
  • 原文地址:https://www.cnblogs.com/wygdove/p/4814320.html
Copyright © 2011-2022 走看看