深度優先遍歷DFS

2021-05-23 12:58:47 字數 879 閱讀 1501

本文章**中的圖用鄰接矩陣來表示,所以演算法複雜度為o(v^2)。如果用鄰接表來表示,那麼演算法的複雜度為o(v+e)。

dfs可用來判斷圖中是否有環,展現無向圖中的連通分支。

通過dfs,形成乙個由多棵深度優先樹所組成的深度優先森林。將原先圖中的邊新增到該森林之後,可以將所有邊定義為以下四類:

1.    樹邊:森林中自帶的邊(即不在森林生成後,從原先圖中新增的邊)。

2.    反向邊:從某個節點指向祖先的邊,包括自己指向自己。非森林自帶的邊。如果圖中存在反向邊,則表明存在環。

3.    正向邊:從某個節點指向後代的邊,非森林自帶的邊。

4.    交叉邊:邊的兩端點之間沒有祖先後代關係,非森林自帶的邊。

在dfs過程中,可以對任意兩點間的邊進行分類,對於有向圖和無向圖,分類情況有所區別。

有向圖:

1.    樹邊:當visit了節點u後,如果邊(u, v)存在,且v為white,則該邊為樹邊。

2.    反向邊:當visit了節點u後,如果邊(u, v)存在,且v為grey,則該邊位反向邊。

3.    正向邊:當visit了節點u後,如果邊(u, v)存在,且v為black,starttime[u] < starttime[v] < endtime[v] < endtime[u],則邊為正向邊。

4.    交叉邊:當visit了節點u後,如果邊(u, v)存在,且v為black,starttime[v] < endtime[v] < starttime[u] < endtime[u],則邊為交叉邊。

無向圖:

1.    樹邊:當visit了節點u後,如果邊(u, v)存在,且v為white,則該邊為樹邊。

2.    反向邊:否則就是反向邊。

**:

深度優先遍歷(DFS)

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

如何實現深度優先遍歷(DFS)

dfs實現步驟如下 訪問頂點v,並標記v已經訪問 查詢v的第乙個鄰接頂點w 若w存在,則繼續執行,否則演算法結束 若w未被訪問,則使用dfs遞迴訪問w 查詢v的下乙個鄰接節點,並記為w,轉到步驟 對上圖進行dfs,則訪問順序為 a b d c e 使用偽 如下 vector g maxn int v...

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

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