·割點
割點概念,應該很好理解:
在一個無向圖中,如果刪除某個頂點,這個圖就不再連通(任意兩點之間無法相互到達),那么這個頂點就是這個圖的割點。 舉個例子:
圖中的2號頂點就是割點, 刪除2號后,4,5不通,1,6也不通等等
如何求割點?
很容易想到的方法是:依次刪除每一個頂點,然后用dfs或者bfs來檢查圖是否依然連通。如果刪除某個頂點后,導致圖不再連通,那么剛才刪除的頂點就是割點。
這種方法的時間復雜度是O(N(N+M))。
下面尋找復雜度低的方法來解決。
首先從圖中任意節點開始dfs遍歷上圖,得到一顆生成樹, 如下圖,圓圈中數字是頂點編號, 圓圈右上角的數表示這個頂點在遍歷時是第幾個被訪問到的,叫做“時間戳”。
在遍歷的時候一定會遇到割點, 關鍵是如何認定一個頂點是割點呢???
在深度優先遍歷的時候訪問到u(點2)點,此時圖被u (點2)分割成兩部分,一部分為已訪問點,另一部分為未訪問點。如果u是割點,那剩下的未被訪問點中至少有一個點在不經過點k的情況下無論如何也回不到已訪問的點。
基本思路:
假如到了u后,圖中還有頂點v是沒有訪問過的點,如何判斷v在不經過u的情況下是否還能回到之前訪問過的任意一個點?u是v的父親,而之前訪問過的頂點就是祖先。 也就是如何檢測v在不經過父親u的情 況下還能否回到祖先。那就是對v再 進行一次dfs,但此次遍歷不經過u, 看能否回到祖先。不能u即為割點。
再定義一個數組low來記錄每個頂點在不經過父頂點時,能夠回到的最小“時間戳”。
對於某個頂點u,如果存在至少一個頂點v(u的兒子),使得low[v]>=num[u],即不能回到祖先,那么u點為割點。
·割邊
除了割點還有一種問題是求割邊(也稱橋),即在一個無向圖中刪除某條邊后,圖不再連通。
如何求割邊?
只需將求割點的算法修改一個符號就可以。 只需將low[v]>=num[u]改為low[v]>num[u]。
這是為什么呢?
low[v]和num[u]相等則表示還可以回到父親結點; 而low[v]>num[u]則表示連父親都回不到了。倘若頂點v不能回到祖先,也沒有另外的路能回到父親,那么 u-v 這條邊就是割邊。
·習題
洛谷P3388 【模板】割點(割頂)
一本通習題3.【模板】旅游航道(橋)
--->最近很懶,每天作業很多,所以更題解可能要在碳硫磷考試結束后吧