2018年8月14号(回顾spfa)

  说实话,我之前没有认真的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 !

猜你喜欢

转载自www.cnblogs.com/zssmg/p/9478185.html
今日推荐