1. 程式人生 > >2018年8月14號(回顧spfa)

2018年8月14號(回顧spfa)

估計 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)