圖的遍曆和樹的遍曆類似,我們希望從圖中某一頂點出發訪遍圖中其餘頂點,且使每一個頂點僅被訪問一次,這一過程 就叫做圖的遍曆(Traverse Graph)。
圖的遍曆方法一般有兩種,第一種是深度優先遍曆(Depth First Search),也 有稱為深度優先搜尋,簡稱為DFS。第二種是《廣度優先遍曆(Breadth First Search)》,也有稱為廣度優先搜尋, 簡稱為BFS。我們在《堆棧與深度優先搜尋》中已經較為詳細地講述了深度優先搜尋的策略,這裡不再贅述。我們也可以把 圖當作一個迷宮,設定一個起始點,走遍所有圖的頂點並打上標記,直到訪問遍所有的頂點為止。如圖7-5-2所示,需要注 意的是結點I 是在從A->H,H->回溯->D,D->I 的時候被訪問到的,而且我們是從A開始遞迴進入下面的路徑, 所以會一直回溯到原點A為止表示遍曆結束。
下面只給出鄰接矩陣和鄰接表格儲存體方式時的圖的深度優先遍曆的演算法代碼,沒有給出整體可供測試回合的代碼,其 實只需要再寫一個建立圖的函數就可以進行整體測試了,可以參考《鄰接矩陣建立圖》和《鄰接表建立圖》
一、如 果我們使用的是鄰接矩陣的方式,則代碼如下:
typedef char VertexType; /* 頂點類型應由使用者定義 */typedef int EdgeType; /* 邊上的權實值型別應由使用者定義 */ #define MAXSIZE 9 /* 儲存空間初始分配量 */#define MAXEDGE 15#define MAXVEX 9 typedef struct{ VertexType vexs[MAXVEX]; /* 頂點表 */ EdgeType arc[MAXVEX][MAXVEX];/* 鄰接矩陣,可看作邊表 */ int numVertexes, numEdges; /* 圖中當前的頂點數和邊數 */} MGraph; bool visited[MAXVEX];/* 訪問標誌的數組 *//* 鄰接矩陣的深度優先遞迴演算法 */void DFS(MGraph MG, int i){ int j; visited[i] = true; cout << MG.vexs[i] << ' '; /* 列印頂點,也可以其它操作 */ for (j = 0; j < MG.numVertexes; j++) if (MG.arc[i][j] == 1 && !visited[j]) DFS(MG, j);/* 對為訪問的鄰接頂點遞迴調用 */}/* 鄰接矩陣的深度遍曆操作 */void DFSTraverse(MGraph MG){ int i; for (i = 0; i < MG.numVertexes; i++) visited[i] = false;/* 初始所有頂點狀態都是未訪問過狀態 */ for (i = 0; i < MG.numVertexes; i++) if (!visited[i]) DFS(MG, i);/* 對未訪問過的頂點調用DFS,若是連通圖,只會執行一次*/}
遍曆結果為: A B C D E F G H I (上圖所示的圖結構)