DFS应用——查找强分支
【0】README
0.1) 本文總結(jié)于 數(shù)據(jù)結(jié)構(gòu)與算法分析, 源代碼均為原創(chuàng), 旨在 理解 “DFS應(yīng)用——查找強(qiáng)分支” 的idea 并用源代碼加以實(shí)現(xiàn) ;
【1】查找強(qiáng)分支
1.1)如何檢測一個圖是否是強(qiáng)連通的: 通過執(zhí)行兩次DFS, 我們可以檢測一個有向圖是否是強(qiáng)連通的, 如果它不是強(qiáng)連通的,那么我們實(shí)際上可以得到頂點(diǎn)的一個子集, 它們到其自身是強(qiáng)連通的;
1.2)首先, 在輸入的圖G上執(zhí)行一次 DFS。 通過對深度優(yōu)先生成森林的后序遍歷將G的頂點(diǎn)編號, 然后再把G 的所有邊反向,形成 Gr**(如何構(gòu)建 Gr)**;
1.3)上述算法通過對 Gr 執(zhí)行一次深度優(yōu)先搜索而完成, 總是在編號最高的頂點(diǎn)開始一次新的DFS。于是,我們在頂點(diǎn)G 開始對 Gr 的DFS, G的編號為10。
1.4)但該頂點(diǎn)不通向任何頂點(diǎn), 因此下一次搜索在H 點(diǎn)開始(以下查找強(qiáng)分支的過程僅僅是一個可能的case,僅舉例而已)。 這次調(diào)用訪問 I 和 J。 下一次調(diào)用在B點(diǎn)開始并訪問 A、C 和 F。 此后的調(diào)用時 DFS(D)以及最終調(diào)用DFS(E)。
1.5)結(jié)果得到的深度優(yōu)先生成森林如下圖所示:
1.6)對深度優(yōu)先生成森林中的分析:
在該深度優(yōu)先生成森林中的每棵樹形成一個強(qiáng)連通分支。 對于我們的例子, 這些強(qiáng)連通分支為 {G}, {H,I,J}, {B,A,C,F},{D} 和 {E};
1.7)為了理解上述算法為什么成立?
- 1.7.1)首先,注意到, 如果兩個頂點(diǎn)v 和 w 都在同一個強(qiáng)連通分支中,那么在原圖G中就存在從 v到w 和從w到v的路徑,因此, 在Gr中也存在。
- 1.7.2)現(xiàn)在,如果兩個頂點(diǎn)v 和 w 不在Gr的同一個深度優(yōu)先生成樹中,那么顯然它們也不可能在同一個強(qiáng)連通分支中;
【2】source code + printing results
2.1)download source code: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter9/p249_dfs_strong_component
2.2)source code at a glance:(for complete code , please click the given link above)
2.3)printing results:
總結(jié)
以上是生活随笔為你收集整理的DFS应用——查找强分支的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DFS应用——寻找欧拉回路
- 下一篇: NP-完全性介绍