為方便對dfs演算法的考察, 為圖g的每個結點設定屬性color表示結點的顏色, color可取white(白色), gray(灰色)或black(黑色), 同時為每個結點設定屬性d表示剛進行對此結點訪問的時刻, 設定屬性f表示剛結束對此結點訪問的時刻, 先給出如下dfs和dfs_visit兩個演算法, 然後對其進行分析.
//深度優先遍歷圖g中所有結點
dfs(g)
time = 0
for g中每個結點v
v.color = white
for g中每個結點v
if v.color == white
v.p = nil//nil表示空
dfs_visit(v)
//深度優先遍歷所有g中從點v可達, 且為白色的結點
dfs_visit(v)
v.d = ++time
v.color = gray
for g中以v為起點的所有邊的終點u//若g為無向圖, 則為g中所有與v鄰接的結點u
if u.color == white
u.p = v
dfs_visit(u)
v.f = ++time
v.color = black
結論1: 演算法dfs(g)必定在執行有限次數後終止(根據執行完第4至5行的迴圈體之後g中所有結點被設為白色, 且每對乙個結點a呼叫dfs_visit(a), a立即被設定為灰色即可證明結論1, 此處不再贅述證明過程)
結論2(白色路徑定理): 演算法dfs_visit(v)將訪問g中所有結點u, 其中u滿足: 存在從v到u均為白色結點構成的路徑
證明: 假設執行完dfs_visit(v)後, g中存在某個呼叫dfs_visit(g, v)初始時刻從從v到b均為白色結點構成的路徑的結點b沒有被訪問, 設
結論3(括號化定理): 對於圖g中任意兩個節點u, v滿足:
(1)u.f < v.d
(2)v.d < u.d < u.f < v.f
(3)u.d < v.d < v.f < u.f
(4)v.f < u.d
上述(1), (2), (3), (4)必居其一且僅居其一.(根據結論2較易證明此結論的正確性, 此處不再贅述證明過程)
結論4: 設有向圖(根據結論2較易證明結論4, 此處不再贅述證明過程)
結論5: 引入結論4定義的有向圖
(1)u為白色, 則為一條樹邊
(2)u為灰色, 稱為一條後向邊, 在
(3)u為黑色, 稱為一條橫向邊, 則v, u在
證明: 根據之前的結論2和結論4較易結論5的正確性, 此處不再贅述證明過程
結論6: 演算法dfs的時間複雜度為o(v + e), v為g中結點個數, e為g中邊的個數(證明從略)
深度優先搜尋演算法(DFS)
1.深度優先搜尋屬於圖的遍歷演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。2.搜尋策略 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進...
DFS深度優先搜尋演算法
例題一 題目大意 約翰的農場被暴風雨給淹沒了,損失很大,他的保險公司將支付給他,但是支付金額取決於被淹沒的最大面積。這個農場是乙個邊長分別為n m的矩形,包含nm個空間,每個空間要麼是幹的,要麼是被淹沒的,一共有k個空間被淹沒。求最大的淹沒面積。ac include include include ...
DFS 深度優先搜尋演算法
深度優先搜尋演算法 depth first search,簡稱dfs 一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的那條邊的起始節點。整個程序反覆進行直到所有節點都被訪問為止。屬於盲...