7.3 圖的遍歷
阿新 • • 發佈:2020-08-14
title: 資料結構 | 圖-3 | 圖的遍歷
date: 2019-11-26 22:38:52
tags: 資料結構
BFS、DFS
深度優先遍歷(DFS)
- 從圖的某一頂點V0出發,訪問此頂點;然後依次從V0的未被訪問的鄰接點出發,深度優先遍歷圖,直至圖中所有和V0相通的頂點都被訪問到;
若此時圖中尚有頂點未被訪問,則另選圖中一個未被訪問的頂點作起點,重複上述過程,直至圖中所有頂點都被訪問為止
//--- 下列演算法使用的全域性變數 --- Boolean visited[MAX]; // 訪問標誌陣列 Status (* VisitFunc)(int v); // 函式變數 void DFS(Graph G, int v) { // 從第v個頂點出發遞迴地深度優先遍歷圖G。 visited[v] = TRUE; VisitFunc(v); // 訪問第v個頂點 for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w)) if(!visited[w]) DFS(G, w); // 對v的尚未訪問的鄰接頂點w遞迴呼叫DFS } void DFSTraverse(Graph G, Status (*Visit)(int v)) { // 對圖G作深度優先遍歷。 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); // 對尚未訪問的頂點呼叫DFS }
廣度優先遍歷(BFS)
- 從圖的某一頂點V0出發,訪問此頂點後,依次訪問V0的各個未曾訪問過的鄰接點;然後分別從這些鄰接點出發,廣度優先遍歷圖,直至圖中所有已被訪問的頂點的鄰接點都被訪問到;
若此時圖中尚有頂點未被訪問,則另選圖中一個未被訪問的頂點作起點,重複上述過程,直至圖中所有頂點都被訪問為止
void BFSTraverse( Graph G, status (*visit )(int v )) { for( v = 0; v < G.vexnum; ++v) visited[v] = FALSE; InitQueue( Q ); for( v = 0; v < G.vexnum; ++ v) if( !visited[v] ){ visited[v] = TRUE; visit( v ); EnQueue( Q, v ); while( !QuqueEmpty( Q)) { Dequeue( Q, u ); for(w=FirstAdjVex(G,u);w;w=NextAdjVex(G,u,w)) if( !Visited[w] ){ Visited[w]=TRUE; Visit( w ); Enqueue(Q,w); }// if }// while }// if }// BFSTraverse