《數據結構和算法》之圖的廣度優先遍歷

一,廣度優先遍歷,又稱爲廣度優先搜索,簡稱BFS。舉例說明,在一套房子裏找一個鑰匙,利用深度優先搜索就是搜索每一個房間,而廣度優先搜索,是先看看鑰匙有沒有放在各個房間的明顯位置,如果沒有,再看看各個房間的抽屜有沒有,這樣逐步擴大查找的範圍的方式我們稱之爲廣度優先搜索。

                           

                                                                                                             圖1  示例圖

      從圖1中可以看到右邊的圖形看着很整潔好看,深度優先遍歷類似於樹的前序遍歷,廣度優先遍歷就類似於右邊的樹的層序遍歷,一層一層逐步往下直到遍歷完所有的頂點爲止。要是實現圖1中右邊的圖的遍歷,可以使用隊列來實現:

                                                                             

                                                                                                            圖2  隊列實現圖

         在圖2中可以看到,出隊列的順序就是ABFCIGEDH。

二,鄰接矩陣的廣度優先遍歷

          

//鄰接矩陣的廣度遍歷算法
void BFSTraverse(MGraph G)   //傳進來一個圖G
{
	int i,j;
	Queue Q;                 //增加一個隊列
	
	for( i=0; i<G.numVertexes; i++)     //創建一個是否被訪問的標誌,numVertexes是記錄一個頂點數的元素
	{
		visited[i] = FALSE;             //這個數組來存放是否被訪問的標誌,初始化爲FALSE
	}
	
	initQueue(&Q);   //初始化隊列   
	
	for(i=0;i<G.numVertexes; i++)       
	{
		if(!visited[i)                  //沒有被訪問過的時候才進行執行以下操作
		{
			printf("%c",G.vex[i]);      //打印訪問的頂點
			visited[i] = TRUE;          //標誌爲已經訪問
			EnQueue(&Q,i);              //插入隊列
			
			while(!QueueEmpty(Q)        //建立一個迭代,只要隊列不爲空就進行循環迭代
			{
				DeQueue(&Q, &i);        //彈出隊列,存放i這個變量裏面
				for(j=0;j<G.numVertexes;j++)  
				{
					if(G.art[i][j]==1 && !visited[j])//判斷說從i到j是否有邊連接起來,如果連接了即結果爲1.或者判斷j沒有被訪問過
					{
						printf("%c",G.vex[j]);    //打印結點
						visited[j] = TRUE;        //標記爲已經訪問
   						EnQueue(&Q, j);           //插入隊列
					}
				}
			}
		}
	}
}
           代碼具體的說明已經在程序註釋中寫的很清楚了。

          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章