圖的表示
對於圖g=(v,e),可以用兩種標準表示方法表示。一種表示法是將圖作為鄰接鍊錶的組合,另一種是將圖作為鄰接矩陣來看待。
鄰接鍊錶
鄰接鍊錶表示由乙個包含|v|條鍊錶的陣列adj所構成,每個結點有一條鍊錶。對於每個結點u,鄰接鍊錶adj[u]包含所有與結點u之間有邊相連的結點v。鄰接鍊錶在表示稀疏圖上很有優勢。鄰接鍊錶的乙個潛在缺陷是無法快速判斷一條邊(u,v)是否是圖中的一條邊,唯一的方法是在鄰接鍊錶adj[u]裡面搜尋結點v。鄰接矩陣克服了這個缺陷,但付出的代價是更大的儲存空間消耗。
鄰接矩陣
對鄰接矩陣表示來說,我們通常會將圖g中的結點編為1、2、……、|v|,這種編號可以任意。在進行編號之後,圖g的鄰接矩陣表示乙個|v|*|v|的矩陣a=(aij)予以表示,該矩陣滿足下述條件:
aij=1 if (i,j)屬於e;否則 aij=0.
關於圖的兩種表示的乙個例子如下所示,其中(b)為鍊錶,(c)為矩陣表示。
過程dfs執行如下。
第1-3行把所有結點置為白色,所有π域初始化為nil。第4行復位全域性變數time,
第5-7行依次檢索v中的結點,發現白色結點時,呼叫dfs_visit去訪問該結點。每次通過第7行呼叫dfs_visit時,結點u就成為深度優先森林中一棵新樹的根,當dfs返回時,每個結點u都對應於乙個發現時刻d[u]和乙個完成時刻f[u]。
每次開始呼叫dfs_visit(u)時結點u為白色,第1行置u為灰色,第2行使全域性時間變數增值並存於d[u]中,從而記錄下發現時刻d[u],
第3-6行檢查和u相鄰接的每個頂點v,且若v為白色結點,則遞迴訪問結點v。
在第3行語句中考慮到每乙個結點v∈adj[u]時,我們可以說邊(u,v)被深度優先搜尋探尋。
最後當以u為起點的所有邊都被探尋後,第7-8行語句置u為黑色並記錄下完成時間f[u]。
主要參考:演算法導論
深度優先搜尋演算法(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,簡稱深搜 是一種極其常用的演算法,簡單來說,符合以下策略的就可以稱為深度優先搜尋。在圖中行走,沒有走過的點稱為 新點 所有走過的點稱為 舊點 開始時所有的點都是新點,從任意節點1出發,走向任意乙個新節點,同時將新節點標記為舊節點,然後重複此步驟。如...