1. 程式人生 > >圖的遍歷-深度優先遍歷

圖的遍歷-深度優先遍歷

與樹的遍歷類似,在此我們希望從圖中某一結點出發訪遍圖中其餘結點,且時每一個頂點僅被訪問一次。這一過程稱為圖的遍歷。圖的遍歷演算法是求解圖的連通性問題、拓撲排序和求關鍵路徑等演算法的基礎。

深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。

規則:訪問v,逐個從v的鄰接點出發,若其未訪問則從其開始遞迴遍歷,如此可遍歷所有與v 連通的頂點。若尚有頂點未訪問,則從其開始重複上述過程。

每個頂點呼叫DFS,DFS主要操作是查詢鄰接點,用鄰接矩陣儲存時查詢某頂點的鄰接點複雜度O(n),總複雜度O(n^2).當鄰接表儲存時查詢鄰接點總複雜度為O(e),總複雜度為O(n+e).

演算法實現:

鄰接矩陣儲存:

bool visited[MVNUM]; //判斷結點是否訪問
Status (*VisitFunc)(MGraph G,int v); //全域性函式指標

遍歷完所有與v聯通的頂點 查詢鄰接點。

void DFS(MGraph G,int v){
	//遍歷完所有與v聯通的頂點 查詢鄰接點
   VisitFunc(G,v);
   visited[v]=TRUE;
   for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
      if(!visited[w])
		  DFS(G,w);
}

圖的深度優先遍歷.

void DFSTraverse(MGraph G,Status (*visit)(MGraph G,int v)){
	/*圖的深度優先遍歷
	訪問v 逐個從v的鄰接點出發,若其未訪問則從其開始遞迴遍歷,如此可
	遍歷所有與v連通的頂點 若尚有頂點未訪問 則從其開始重複上述過程*/
   int v;
   VisitFunc=visit;
   for(v=0;v<G.vexnum;v++) //初始化
      visited[v]=FALSE;
   for(v=0;v<G.vexnum;v++)
	  if(!visited[v])
		  DFS(G,v);
}

鄰接表儲存:

void DFSTraverse(ALGraph G,Status (*visit)(ALGraph G,int v)){
	/*圖的深度優先遍歷
	訪問v 逐個從v的鄰接點出發 若其未訪問則從其開始遞迴遍歷如此
	可遍歷所有與v連通的頂點 若尚有頂點未訪問,則從其開始重複上
	述過程 */
   int v;
   VisitFunc=visit;
   for(v=0;v<G.vexnum;v++) //初始化
       visited[v]=FALSE;
   for(v=0;v<G.vexnum;v++)
      if(!visited[v])
          DFS(G,v);
}