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 !
Keep on going never give up.
勇往直前, 决不放弃!