割點概念,應該很好理解:算法
在一個無向圖中,若是刪除某個頂點,這個圖就再也不連通(任意兩點之間沒法相互到達),那麼這個頂點就是這個圖的割點。 舉個例子:數組
圖中的2號頂點就是割點, 刪除2號後,4,5不通,1,6也不通等等spa
很容易想到的方法是:依次刪除每個頂點,而後用dfs或者bfs來檢查圖是否依然連通。若是刪除某個頂點後,致使圖再也不連通,那麼剛纔刪除的頂點就是割點。 blog
這種方法的時間複雜度是O(N(N+M))。模板
下面尋找複雜度低的方法來解決。遍歷
首先從圖中任意節點開始dfs遍歷上圖,獲得一顆生成樹, 以下圖,圓圈中數字是頂點編號, 圓圈右上角的數表示這個頂點在遍歷時是第幾個被訪問到的,叫作「時間戳」。方法
在深度優先遍歷的時候訪問到u(點2)點,此時圖被u (點2)分割成兩部分,一部分爲已訪問點,另外一部分爲未訪問點。若是u是割點,那剩下的未被訪問點中至少有一個點在不通過點k的狀況下不管如何也回不到已訪問的點。im
假如到了u後,圖中還有頂點v是沒有訪問過的點,如何判斷v在不通過u的狀況下是否還能回到以前訪問過的任意一個點?u是v的父親,而以前訪問過的頂點就是祖先。 也就是如何檢測v在不通過父親u的情 況下還可否回到祖先。那就是對v再 進行一次dfs,但這次遍歷不通過u, 看可否回到祖先。不能u即爲割點。時間戳
再定義一個數組low來記錄每一個頂點在不通過父頂點時,可以回到的最小「時間戳」。d3
對於某個頂點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.【模板】旅遊航道(橋)
--->最近很懶,天天做業不少,因此更題解可能要在碳硫磷考試結束後吧