廣度優先遍曆(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)。