最短路径算法—SPFA(Shortest Path Faster Algorithm)算法分析与实现(C/C++)

来源:互联网 发布:淘宝网内衣店 编辑:程序博客网 时间:2024/05/22 14:31

建议看SPFA前先看看Dijkstra和Bellman-Ford这两个最短路算法。

SPFA的思路比较简单,网上的说法也比较统一,NOCOW和百度百科上都有。这里在网上找到讲的比较通俗易懂的:

SPFA(Shortest Path Faster Algorithm)
是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。
算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,
并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。
它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,可以处理负边。

SPFA 在形式上和BFS非常类似,不同的是BFS中一个点出了队列就不可能重新进入队列,但是SPFA中
一个点可能在出队列之后再次被放入队列,也就是一个点改进过其它的点之后,过了一段时间可能本
身被改进,于是再次用来改进其它的点,这样反复迭代下去。

判断有无负环:如果某个点进入队列的次数超过V次则存在负环(SPFA无法处理带负环的图)。

SPFA算法有两个优化算法 SLF 和 LLL:
SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)

const int INF = 999999;int  map[MAXN][MAXN]; //map[i,j]为初始输入的i到j的距离,未知的map[i,j]=INF;int  dis[MAXN];char vst[MAXN];// 参数n表示结点数,s表示源点int SPFA(int n, int s){    // pri是队列头结点,end是队列尾结点    int i, pri, end, p, t;    memset(vst, 0, sizeof(vst));    for(int i=0; i<MAXN; ++i)        Q[i] = 0;    for (i=0; i<n; i++)        dis[i] = INF;    dis[s] = 0;    vst[s] = 1;    Q[0] = s; pri = 0; end = 1;    while (pri < end)    {        p = Q[pri];        for (i=0; i<n; ++i)        {            //更新dis            if (dis[p]+map[p][i] < dis[i])            {                dis[i] = dis[p]+map[p][i];                if (!vst[i])     //未在队列中                {                    Q[end++] = i;                    vst[i] = 1;                }            }        }        vst[p] = 0;   // 置出队的点为未标记        pri++;    }    return 1;}

HDU 1874可以用SPFA试试:


以上内容转自http://www.wutianqi.com/?p=2285

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 儿童迷上玩手机怎么办 普法考试错过了怎么办? 普法考试不过关怎么办 普法考试没及格怎么办 错过法宣考试怎么办 两套房改房不退怎么办 孩子初一政治差怎么办 学生上课老说话怎么办 一年级语文太差怎么办 二年级成绩不好怎么办 初中学生数学差怎么办 孩子数学计算能力差怎么办 股票没有客户号怎么办 五岁宝宝鼻炎怎么办 孩子怕老师家长怎么办 孩子得了厌学症怎么办 幼儿不好好吃饭怎么办 孩子在学校胆小怎么办 孩子胆小没自信怎么办 特别倔强的学生怎么办 初中生注意力不集中怎么办 父母水平太低怎么办 父母不肯买电脑怎么办 与父母性格不合怎么办 父母和孩子吵架怎么办 如果有孩子离婚怎么办 离婚时成年孩子怎么办 父母离婚后孩子怎么办 父母吵架闹离婚怎么办 父母吵架后冷战怎么办 家里每天都吵架怎么办 夫妻因为钱吵架怎么办 离婚了很痛苦怎么办 身份证丢了怎么办离婚 和老婆离婚了怎么办 老婆跟前任联系怎么办 离异小孩上户口怎么办 离婚之后孩子户口怎么办 父母离婚孩子户口怎么办 夫妻离婚孩子户口怎么办 孩子有心理阴影怎么办