2018年8月14號(回顧spfa)
阿新 • • 發佈:2018-08-15
估計 spfa算法 優化 負環 同時 論文 clas 調整 掃描
說實話,我之前沒有認真的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)