數據結構-圖的分析

1、有向圖的強連通分量的計算:Kosaraju算法

時間複雜度:O(V+E),對於有向圖的強連通性查詢可以在常數時間內完成。

步驟:1、對圖G進行轉置(反向圖)得到圖Gr

   2、對Gr求得逆反序,即Gr的拓撲序列

   3、從Gr的拓撲序列開始,進行深度優先搜索,得到的搜索樹即強聯通分量。

說實話,這個算法從代碼量上是非常簡潔的,僅僅就是從遍歷所有節點(0,1....v)變成了按照拓撲序列開始遍歷,多一個棧來存儲Gr的逆後序,其他的都和標準的深度優先搜索一致。

但難就難在理解,爲什麼用Gr的逆反序進行dfs(s)可達v就能證明S,V是強連通的。

首先:dfs(s)可達v,是在Gr中,而Gr是G的反向圖,則在G中,V->S是可達的。現在需要證明的就是通過這個dfs能證明s->v是可達的。

而我們知道,有向圖的基於深度優先的頂點排序,前序是代表dfs()的調用順序,後序是代表頂點遍歷完成的順序,逆後序從字面就能理解。

而在逆後序的棧中,s在v之前被遍歷到,證明v是比s先入棧的,即先完成的結點。

因此根據DFS調用的遞歸性質,DFS(v)應該在DFS(s)之前返回,而有兩種情形滿足該條件:

  1. DFS(v) START -> DFS(v) END -> DFS(s) START -> DFS(s) END
  1. DFS(s) START -> DFS(v) START -> DFS(v) END -> DFS(s) END

是因爲而根據目前的已知條件,GR中存在一條sv的路徑,即意味着G中存在一條vs的路徑,

而在第一種情形下:調用DFS(v)卻沒能在它返回前遞歸調用DFS(s)(即v->s不可達,與已知條件相悖),這是和G中存在vs的路徑相矛盾的,因此不可取。

故情形二爲唯一符合邏輯的調用過程。而根據DFS(s) START -> DFS(v) START可以推導出從sv存在一條路徑。(符合dfs中for(int s:order.reverseOrder())即v是s可達的點。


發佈了23 篇原創文章 · 獲贊 1 · 訪問量 4584
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章