圖的遍歷-深度優先遍歷
阿新 • • 發佈:2018-12-15
與樹的遍歷類似,在此我們希望從圖中某一結點出發訪遍圖中其餘結點,且時每一個頂點僅被訪問一次。這一過程稱為圖的遍歷。圖的遍歷演算法是求解圖的連通性問題、拓撲排序和求關鍵路徑等演算法的基礎。
深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。
規則:訪問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); }