簡體   English   中英

圖與 BFS 和 DFS 樹的等價

[英]Equivalence of a graph and a BFS and DFS tree

我有這個問題,我無法證明。 有人可以對這個問題提供一些見解嗎

我們有一個連通圖 G = (V,E),並且作為特定的頂點 u ∈ V。假設我們計算一個以 u 為根的深度優先搜索樹,並獲得一個包含 G 的所有節點的樹 T。假設我們然后計算以 u 為根的廣度優先搜索樹,並得到相同的樹 T。 證明 G = T。 (換句話說,如果 T 既是深度優先搜索樹又是以 u 為根的廣度優先搜索樹,則G 不能包含任何不屬於 T 的邊。)

來自 伯克利 CS 課程解決方案

  • 假設輸入圖G是無向且連通的,但不是樹。
  • 那么G必須包含一個循環C 假設C由 k 個節點v1, v2, ..., vk 組成,C是循環v1 → v2 → 。 . . → vk → v1
  • 現在,在DFS樹中,節點v1、v2、...、vk都將位於從根到葉的同一路徑上。
  • 為什么? 假設vf是這些節點中第一個被訪問的節點。 然后,必須在explore(vf)期間的某個時刻訪問剩余的節點,因為其他vi都是強連接的。
  • 但是,在BFS樹中,節點v1、v2、...、vk至少會形成兩個分支,從最先訪問的節點開始(想象在循環上執行BFS )。 因此,輸入圖是一棵樹時, BFSDFS產生相同的樹。

@dtldarek 在math.stackechange 中的另一種方法:

  • 這是真的,如果圖是簡單的、連通的和無向的,並且非常基本的觀察是 G 是一棵樹,當且僅當在 BFS/DFS 搜索中遍歷每條邊。
  • 假設TBFS=T=TDFS,但是存在e∈E(G)∖E(T),即一條邊沒有被任何算法訪問過。
  • 這條邊沒有被遍歷的唯一原因可能是另一邊的頂點已經被訪問過,但是如果有一個 DFS-back-edge 那么 BFS 之前肯定已經使用過它。

一旦您了解了 BFS 和 DFS 以及它們之間的基本區別,證明就非常簡單了。

BFS VS DFS

dfs 和 bfs 之間的主要區別在於它們如何從根開始構建樹。不同之處在於一旦訪問了一個頂點,如何訪問相鄰頂點。讓我們以簡單的方式 1 x 1 解決每個遍歷。

1.BFS

1.BFS從訪問root開始。 然后訪問與根相距 1 條邊的頂點。 假設有 4 個頂點 a,b,c,d 與 root 相鄰。那么 bfs 將在訪問 root 后立即訪問這 4 個頂點。

2.一旦bfs完成訪問距離根1條邊的頂點。 然后取root之后訪問的第一個頂點並重復相同的過程。哪個頂點是第一個,這是由隊列數據結構處理的

這就是 BFS 也稱為層序遍歷的原因,當您使用它來遍歷樹時。因為它逐層訪問頂點,並且在樹的情況下,層級是明確定義的。

分布式文件系統

1.DFS從訪問根開始。 訪問根后不會訪問與根相鄰的所有頂點,而是進入圖的深度。

2.一旦訪問root,它只訪問與root相鄰的頂點,然后從該頂點本身開始dfs,即在訪問與root相鄰的所有頂點之前進入深度。 只有在它開始 dfs 的方向深度上訪問了頂點后,它才會出現在它們身上。

需要注意的重要一點是,BFS 以自上而下的方式構建樹,而 DFS 以自下而上的方式構建樹

如果兩棵樹相同,那么當你的圖本身是樹時就是這種情況。樹只能是特殊的兩種類型。

這僅適用於像這樣的傾斜樹的圖:

root
|
|
V1
|
|
V2
|
|
.
.
.
Vn

在這種情況下, bfs 和 dfs 都朝着一個方向發展。

或者像這樣的星形拓撲圖:

               V1
               /
              /
   Vn-----root------V2
          |  \
          |   \
          V4  V3

陳述證明

與上述兩棵樹不同的任何其他樹都會像在第 x 層存在中間頂點 v 並且它在第 x+1 層有 1 個以上的子節點(比如 2)c1 和 c2,bfs 會做的是訪問 v 然后訪問 c1和 c2,但是 dfs 會做的是訪問 v,然后是 c1,然后是 c1 的孩子,所以很明顯,在這兩種情況下,遍歷不會相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM