圖--廣度優先遍曆

來源:互聯網
上載者:User
廣度優先遍曆(Breadth-FirstTraversal)

1、廣度優先遍曆的遞迴定義

     設圖G的初態是所有頂點均未訪問過。在G中任選一頂點v為源點,則廣度優先遍曆可以定義為:首先訪問出發點v,接著依次訪問v的所有鄰接點w 1,w 2,…,w t,然後再依次訪問與w l,w 2,…,w t鄰接的所有未曾訪問過的頂點。依此類推,直至圖中所有和源點v有路徑相通的頂點都已訪問到為止。此時從v開始的搜尋過程結束。
     若G是連通圖,則遍曆完成;否則,在圖C中另選一個尚未訪問的頂點作為新源點繼續上述的搜尋過程,直至G中所有頂點均已被訪問為止。
     廣度優先遍曆類似於樹的按層次遍曆。採用的搜尋方法的特點是儘可能先對橫向進行搜尋,故稱其為廣度優先搜尋(Breadth-FirstSearch)。相應的遍曆也就自然地稱為廣度優先遍曆。

2、廣度優先搜尋過程
     在廣度優先搜尋過程中,設x和y是兩個相繼要被訪問的未訪問過的頂點。它們的鄰接點分別記為x 1,x 2,…,x s和y 1,y 2,…,y t。
     為確保先訪問的頂點其鄰接點亦先被訪問,在搜尋過程中使用FIFO隊列來儲存已訪問過的頂點。當訪問x和y時,這兩個頂點相繼入隊。此後,當x和y相繼出隊時,我們分別從x和y出發搜尋其鄰接點x 1,x 2,…,x s和y 1,y 2,…,y t,對其中未訪者進行訪問並將其人隊。這種方法是將每個已訪問的頂點人隊,故保證了每個頂點至多隻有一次人隊。

3、廣度優先搜尋演算法
(1)鄰接表表示圖的廣度優先搜尋演算法
  void BFS(ALGraph*G,int k)
  {// 以v k為源點對用鄰接表表示的圖G進行廣度優先搜尋
    int i;
    CirQueue Q; //須將隊列定義中DataType改為int
    EdgeNode *p;
    InitQueue(&Q);//隊列初始化
     //訪問源點v k
     printf("visit vertex:%e",G->adjlist[k].vertex);
    visited[k]=TRUE; 
    EnQueue(&Q,k);//v k已訪問,將其人隊。(實際上是將其序號人隊)
    while(!QueueEmpty(&Q)){//隊非空則執行
        i=DeQueue(&Q); //相當於v i出隊
        p=G->adjlist[i].firstedge; //取v i的邊表頭指標
        while(p){//依次搜尋v i的鄰接點v j(令p->adjvex=j)
            if(!visited[p->adivex]){ //若v j未訪問過
              printf("visitvertex:%c",C->adjlistlp->adjvex].vertex); //訪問v j
              visited[p->adjvex]=TRUE; 
              EnQueue(&Q,p->adjvex);//訪問過的v j人隊
             }//endif
            p=p->next;//找v i的下一鄰接點
         }//endwhile
      }//endwhile

   }//end of BFS


(2)鄰接矩陣表示的圖的廣度優先搜尋演算法
  void BFSM(MGraph *G,int k)
  {以vk為源點對用鄰接矩陣表示的圖G進行廣度優先搜尋
   int i,j;
   CirQueue Q;
  InitQueue(&Q);
   printf("visit vertex:%c",G->vexs[k]); //訪問源點vk
   visited[k]=TRUE;
   EnQueue(&Q,k);
   while(!QueueEmpty(&Q)){
      i=DeQueue(&Q); //vi出隊
      for(j=0;j<G->n;j++)//依次搜尋vi的鄰接點vj
          if(G->edges[i][j]==1&&!visited[j]){//vi未訪問
              printf("visit vertex:%c",G->vexs[j]);//訪問vi
              visited[j]=TRUE;
              EnQueue(&Q,j);//訪問過的vi人隊
                 }
     }//endwhile
  }//BFSM

(3) 廣度優先遍曆演算法
     類似於DFSTraverse。【參見DFSTraverse演算法】

4、圖的廣度優先遍曆序列
     廣度優先遍曆圖所得的頂點序列,定義為圖的廣度優先遍曆序列,簡稱BFS序列。
(1)一個圖的BFS序列不是惟一的
(2)給定了源點及圖的儲存結構時,演算法BFS和BFSM所給出BFS序列就是惟一的


【例】上圖中G7以鄰接表為儲存結構,以v0為出發點的BFS搜尋過程和BFS序列【參見動畫示範】

5、演算法分析
     對於具有n個頂點和e條邊的無向圖或有向圖,每個頂點均入隊一次。廣度優先遍曆(BFSTraverse)圖的時間複雜度和DFSTraverse演算法相同。
     當圖是連通圖時,BFSTraverse演算法只需調用一次BFS或BFSM即可完成遍曆操作,此時BFS和BFSM的時間複雜度分別為O(n+e)和0(n2)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.