关于最短路算法SPFA

来源:互联网 发布:php curl post header 编辑:程序博客网 时间:2024/06/14 08:51

 SPFA算法就是bellman-ford算法的一种实现方式,其中用了队列来优化bellman-ford算法,从而减少了冗余的松弛操作,是一种高效的最短路算法。事实上SPFA算法的核心就是宽度优先搜索,实现方式为队列,主要过程为将起点入队,将和队头相邻且不在队列中的边入队,对和队头点相邻的点做松弛操作,将队头出队,直到队列中没有任何元素,需要注意的就是在图论的题中对重边的处理,另外SPFA算法有两种优化方式SLF和LLL,大家可以自行查阅,下面还是例题HDU2544


Problem Description

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input

输入包括多组数据。每组数据第一行是两个整数NMN<=100M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数ABC1<=A,B<=N,1<=C<=1000,表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

Sample Input

2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0

Sample Output

3 2

#include<iostream>#include<queue> #include<cstring>#define N 211#define MAX 10000000using namespace std;int Cmap[1001][1001];//邻接矩阵储存图 queue <int> que;//队列储存 bool v[N];//是否在队列中 int s[N];//记录松弛操作结果的数组 int n,m,x,y,z,tmp,st,ed;void init()//初始化 {    for(int i=0;i<N;i++)    {        s[i]=MAX;        v[i]=false;        for(int j=0;j<N;j++)        {            if(i==j) Cmap[i][i]=0;            else    Cmap[i][j]=MAX;        }    }    while(!que.empty())    {        que.pop();    }    st=ed=tmp=0;}void spfa(){    st=1;    ed=n;    s[st]=0;    que.push(st);//起点入队     v[st]=true;    while(!que.empty())//判断队列非空     {        tmp=que.front();        que.pop();        v[tmp]=false;        for(int i=1;i<=n;i++)//松弛操作并判断入队         {                if(Cmap[tmp][i]<MAX)            {                if(s[i]>s[tmp]+Cmap[tmp][i])                {                    s[i]=s[tmp]+Cmap[tmp][i];                    if(v[i]==false)                    {                        v[i]=true;                        que.push(i);                    }                            }                                    }            }    }}int main(){    while(cin>>n>>m)    {        if(n==0&&m==0) break;        init();                for(int i=0;i<m;i++)        {            cin>>x>>y>>z;            Cmap[x][y]=Cmap[y][x]=z<Cmap[x][y]?z:Cmap[x][y];//判重         }        spfa();        cout<<s[ed]<<endl;    } } 



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 超市买东西多收钱怎么办 王者荣耀换系统怎么办 夹娃娃夹子松怎么办 天猫魔盒遥控器没了怎么办 合约机被骗了怎么办 二手苹果合约机怎么办 手机系统老化了怎么办 手机显示电池老化怎么办 手机移动数据打不开怎么办 武汉移动大王卡怎么办 红米手机卡死了怎么办 红米手机死机怎么办 红米note5装卡大怎么办 手机卡二不显示怎么办 小米手机声音小怎么办 小米4手机屏幕失灵怎么办 安装包证书异常怎么办 安装包出现异常怎么办 红米手机按键失灵怎么办 红米手机内存不足怎么办 红米note2内存不足怎么办 信号强度-98dbm怎么办 小米mix2误触怎么办 指纹功能不能用怎么办 红米手机中毒怎么办 小米4手机卡顿怎么办 红米内存大还卡怎么办 小米6x卡槽小怎么办 红米note砖头怎么办 mi4c不支持4G怎么办 小米手机抢不到怎么办 洗衣机外壳凹了怎么办 塑料手机套变黄怎么办 淘宝上没货了怎么办啊 华为手机音量低怎么办 手机电池冲鼓了怎么办 手机电池起鼓了怎么办 手机信息总提示怎么办 一体机电池不耐用怎么办 血糖偏高怎么办雅培益力佳SR 投诉电话打不通怎么办