图论浅析--最短路之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;
}

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

posted @ 2015-08-02 17:19  wygdove  阅读(305)  评论(1编辑  收藏  举报