演算法研究:圖的深度優先遍曆

來源:互聯網
上載者:User

圖的遍曆和樹的遍曆類似,我們希望從圖中某一頂點出發訪遍圖中其餘頂點,且使每一個頂點僅被訪問一次,這一過程 就叫做圖的遍曆(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 (上圖所示的圖結構)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.