【雙連通分量】
一、邊雙連通分量定義
在分量內的任意兩個點總可以找到兩條邊不相同的路徑互相到達。總而言之就是一個圈,正着走反着走都可以相互到達,至少只有一個點。
二、點雙連通分量的定義
參照上面,唯一的不同:任意兩個點可以找到一個點不同的路徑互相到達。也是一個圈,正反走都可以,至少為一個點。
三、邊、點雙連通分量模板代碼要注意的地方
邊雙連通分量:
1.每個節點的所有兒子遍歷后才開始計算分量大小,請與點雙連通相區分;
2.割頂只能屬於一個分量,請與割邊區分;(容易搞混)
3.要注意j是否是i的父節點;
點雙連通分量:
1.每遍歷一個兒子就計算是否有點連通分量;
2.割頂可以屬於多個連通分量,請注意與割邊區分;
3.當i為根節點時,至少要有兩個兒子才能是割點;
【強連通分量】
一、定義
有向圖上的環,不啰嗦,與上面兩種類似,至少為一個點;
二、模板代碼注意的地方
1.每個點所有兒子遍歷完才開始求分量;(類似邊雙連通分量)
2.每個點只能屬於一個分量;
【強連通分量和雙連通分量常見的模型和問法】
雙連通分量
1.給出的圖是非連通圖,如:
a.有一些點,一些邊,加最少的邊,要使得整個圖變成雙聯通圖。
大致方法:求出所有分量,把每個分量看成一個點,統計每個點的度,有一個度為一則cnt加1,答案為(cnt+1)/2;
b.有一些點,一些邊,問最少多少個點單着。
大致方法:求出所有的分量即可,但要注意不同的題可能有特殊要求(如圓桌騎士要求奇圈,要用到二分圖判定)
c.各種變式問題
2.給出的圖是連通圖,如:
a.給定一個起點一個終點,求各種問題是否能實現。
大致方法:求出所有分量,並把每個分量當成點,於是問題得到化簡;
b.給一個圖,然后有大量的離線回答。
大致方法:求出所有分量,再求出上下子樹的信息;
c.各種變式問題;
強連通分量
1.給出的是非連通圖,如:
a.有一些點,一些有向邊,求至少加多少邊使任意兩個點可相互到達
大致方法:求出所有的分量,縮點,分別求出出度入度為0的點的數量,取多的為答案;
b.有一些點,一些有向邊,求在這個圖上走一條路最多可以經過多少個點
大致方法:求出所有的分量,縮點,形成一個或多個DAG圖,然后做DAG上的dp
c.有一些點,一些有向邊,給出一些特殊點,求終點是特殊點的最長的一條路
大致方法:求出所有分量,並標記哪些分量有特殊點,然后也是DAG的dp
2.給出的是連通圖,比較少,有也比較簡單
----------------------------------------------------------------
總結:
1.遇到非連通圖幾乎可以肯定是要求連通分量,不論是無向還是有向圖;(可以節約大量思考時間)
2.凡是對邊、點的操作,在同一個分量內任意一個點效果相同的,幾乎都是縮點解決問題;再粗暴點,幾乎求了連通分量都要縮點;
3.一定要考慮特殊情況,如整個圖是一個連通分量等(考慮到了就有10-20分);
4.對於雙連通分量要分析是邊還是點雙連通分量;通過題目來判斷;
5.拿到題目要先搞清楚給的是連通圖還是非連通圖。