DFS深度優先遍歷演算法詳解與實現

2021-09-02 07:50:26 字數 1768 閱讀 5878

概括:深度優先是沿著一條路一直走到底,然後進行回溯

該演算法是基於圖的鄰接表儲存實現的

圖的鄰接表儲存方式

注意,鄰接表中邊表節點中儲存的值是該節點在陣列中的索引值,而頂點表節點儲存的是資料

使用乙個一維陣列visited

標記訪問過的頂點,對應的下標的元素為1(代表已經被訪問),0(代表沒有被訪問)

v是第乙個需要訪問的頂點在頂點表中的索引值,注意,是索引值。假設v = 0,則將visited[0]標為1.

p是指向頂點表[v]的鄰接點指標。p = vertices[v].firstarc.

注意,p不是從p = vertices[v]開始的,而是從某頂點的鄰接點。p = vertices[v].firstarc.

判斷p是否為空

不為空,則v  = p->adjvex節點可以訪問,遞迴到step1,將visited[1] = 1

然後繼續訪問v的鄰接點,p = vertices[v].firstarc

如果p不為空,則v  = p->adjvex節點也訪問過了,visited[2] = 1

然後繼續訪問v的鄰接點,p = vertices[v].firstarc

此時vertices[4].first為空,則p指向上一次訪問的頂點

然後執行step3,step1,step2,step3......

程式不斷重複執行step1,step2,step3,可以用遞迴的方式實現。

c語言實現**

//訪問標誌陣列

int visited[max] = ;

//用鄰接表方式實現深度優先搜尋(遞迴方式)

//v 傳入的是第乙個需要訪問的頂點索引值

void dfs(mgraph g, int v)

//p指向頂點v的下一條弧的弧頭結點

p = p->nextarc;}}

(堆疊)

演算法基礎 DFS(深度優先遍歷)

brycezou 163.com dfs的基本思想 從圖的某個頂點開始,一路向前,當沒有 新的 未被訪問的 頂點可訪問時逐層回退,繼續去發現新的頂點 直到源點可達的所有頂點都被訪問為止。這一過程類似於樹的前序遍歷。本文基於圖的鄰接表形式,分別給出了遞迴版本和非遞迴版本的dfs演算法 本 旨在清晰地展...

深度優先遍歷DFS

本文章 中的圖用鄰接矩陣來表示,所以演算法複雜度為o v 2 如果用鄰接表來表示,那麼演算法的複雜度為o v e dfs可用來判斷圖中是否有環,展現無向圖中的連通分支。通過dfs,形成乙個由多棵深度優先樹所組成的深度優先森林。將原先圖中的邊新增到該森林之後,可以將所有邊定義為以下四類 1.樹邊 森林...

深度優先遍歷(DFS)

深度優先搜尋是一種列舉所有完整路徑以遍歷所有情況的搜尋方法。使用遞迴可以很好的實現深度優先遍歷,因此,只能說遞迴是實現深度優先遍歷的一種實現方式。給定乙個序列,列舉這個序列所有的子串行 例如子串行包含,選擇最優子串行,使它的某個特徵是所有子串行中最優的。這個問題也就是從n個整數中,選擇k個數的所有方...