軟考筆記-有向圖的鄰接矩陣
下面是2024年上半年的選擇題:
對下列有向圖的鄰接矩陣,進行深度遍歷的次序是( )。
V1 | V2 | V3 | V4 | V5 | V6 |
---|---|---|---|---|---|
∞ | 18 | 3 | ∞ | ∞ | ∞ |
∞ | ∞ | 5 | ∞ | 4 | ∞ |
∞ | ∞ | ∞ | ∞ | ∞ | ∞ |
∞ | 15 | ∞ | ∞ | ∞ | ∞ |
∞ | ∞ | ∞ | 12 | ∞ | ∞ |
∞ | ∞ | ∞ | ∞ | ∞ | ∞ |
A.v1-v2-v3-v4-v5-v6 B.v1-v4-v2-v3-v5-v6
C.v1-v2-v3-v5-v4-V6 D.v1-V2-v5-V4-v3-v6
解答:
題目中給出的圖需要最佳化,方便我們找各個頂點之間的關係,如下:
V1 | V2 | V3 | V4 | V5 | V6 | |
---|---|---|---|---|---|---|
V1 | ∞ | 18 | 3 | ∞ | ∞ | ∞ |
V2 | ∞ | ∞ | 5 | ∞ | 4 | ∞ |
V3 | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ |
V4 | ∞ | 15 | ∞ | ∞ | ∞ | ∞ |
V5 | ∞ | ∞ | ∞ | 12 | ∞ | ∞ |
V6 | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ |
在這個圖中,節點V1到V6之間的連線情況如下(∞表示沒有直接邊):
- V1 -> V2 (權重18)
- V1 -> V3 (權重3)
- V2 -> V3 (權重5)
- V2 -> V5 (權重4)
- V4 -> V2 (權重15)
- V5 -> V4 (權重12)
深度優先搜尋(DFS)是從給定的起始頂點開始,儘可能深地探索每個分支,直到無法繼續為止,然後回溯並嘗試另一條路徑。根據題目提供的鄰接矩陣,我們從V1開始進行深度遍歷。假設從V1開始:
- 從V1出發,可以去V2或V3。
- 我們選擇先訪問V3(也可以先訪問V2,但為了簡化說明,這裡以V3為例)。因此,當前遍歷順序為[V1, V3]。
- V3沒有其他可訪問的鄰居,所以回到V1。
- 從V1再去V2。現在遍歷順序為[V1, V3, V1, V2]。
- 從V2出發,可以選擇V3或者V5。由於V3已經被訪問過,我們前往V5。遍歷順序更新為[V1, V3, V1, V2, V5]。
- 從V5出發,可以去V4。遍歷順序變為[V1, V3, V1, V2, V5, V4]。
- V4指向V2,但由於V2已經訪問過了,所以停止。因此,一個可能的深度遍歷次序是:V1 -> V3 -> V1 -> V2 -> V5 -> V4。
需要注意的是,選項中沒有這個選項。原因:如果選擇不同的起點或者是對等選項時選擇了不同的下一個節點,則最終得到的具體遍歷順序可能會有所不同。例如,如果一開始選擇了從V1到V2而不是V3,那麼結果會有所變化。
那麼我們選擇從V1到V2,重複上述步驟:
- 從V1出發,可以去V2或V3。
- 我們選擇先訪問V2。因此,當前遍歷順序為[V1, V2]。
- V2可以訪問V3。所以,當前遍歷順序為[V1, V2,V3]。
- V3沒有其他可訪問的鄰居,所以回到V2。[V1, V2,V3,V2]。
- 再從V2出發,由於V3訪問過了,所以現在訪問V5。[V1, V2,V3,V2,V5]。
- 再從V5出發,V5只能訪問V4。[V1, V2,V3,V2,V5,V4]。
- 再從V4出發,V4只能訪問V2,但是V2訪問過了。當目前只有V6沒有訪問,看圖可知,V6在這個過程中並沒有被訪問到,因為V6在圖中是孤立的節點,沒有任何邊與之相連。V6的部分實際上是無法透過DFS直接訪問到的。如果題目要求包含所有節點,那麼V6應該被視為孤立節點,單獨處理。所以最後單獨訪問V6。最終的結果是[V1, V2,V3,V2,V5,V4,V6]。
我們得到的答案是:[V1, V2,V3,V2,V5,V4,V6]
注意我們重複步驟時,為了儘可能詳細,回溯V2時保留了再次從V2出發的頂點,這個是可以省略的。所以最終結果是:[V1, V2,V3,V5,V4,V6],選C。