码迷,mamicode.com
首页 > 其他好文 > 详细

2018年8月14号(回顾spfa)

时间:2018-08-14 22:47:56      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:void   先进先出   其他   取出   2018年   图论   理解   push   col   

  说实话,我之前没有认真的spfa,现在后悔不以,特别是今天考了三题的图论,多要用到spfa,我肯定是懵逼地看题发呆;没有办法,知得晚上晚自习时写篇论文来回顾一下。

  Bellman-ford大家应该都知道,其实spfa就在中国是这样叫的,在国外他们是叫“队列优化的Bellman-Ford算法”,管他的,还是先理解算法;

  先建一个先进先出的队列来保存待优化的节点(这是啥意识?反正书上是这样讲的),优化时每次取出队列节点u,并用找到u这个值来更新过其他点,对u点所指向的的节点v做松弛操作,如果v点的最短路估计值有所调整,且v点不在当前的队列中,就将v点插入队尾。这样不断从队列去出节点进行松弛操作,直到队列为空;

  spfa算法同时可以很容易判断负环,其实只要一个计数器计算摸个点弹出超过n-1就可以判断他有负环了(这个还是so easy);

 1 void spfa()
 2 {
 3     memset(d,127,sizeof(d));
 4     memset(v,0,sizeof(v));//标记是否在队列里 
 5     d[1]=0;v[1]=1;
 6     q.push(1);
 7     while(q.size())
 8     {
 9         int x=q.front();q.pop();//取出队头 
10         v[x]=0;
11         for(int i=head[x];i;i=Next[i]);//扫描所有出边 
12         {
13             int y=ver[i],z=edge[i];
14             if(d[y]>d[x]+z)
15             {
16                 d[y]=d[x]+z;
17                 if(!v[y])//更新将v入队 
18                 q.push(y),v[y]=1;
19             }
20         }
21     }
22 }

over !

2018年8月14号(回顾spfa)

标签:void   先进先出   其他   取出   2018年   图论   理解   push   col   

原文地址:https://www.cnblogs.com/zssmg/p/9478185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!