點雙 邊雙 強聯通分量整理

2021-08-29 20:28:39 字數 1661 閱讀 6439

例題首先要明確各種定義,非常容易搞混:

時間戳:陣列一般叫dfn

dfn[\;]

dfn[

],記錄點第一次入棧的順序。

搜尋樹:dfs 時生成的樹

割點:去掉這個點,原無向聯通圖不再聯通。割點集合同理。

割邊/橋:去掉這條邊,原無向聯通圖不再聯通。

點雙聯通圖:不存在割點的圖。判定:頂點數不超過2的無向聯通圖是點雙。頂點數大於2的無向連通圖是點雙,當且僅當任意兩點至少包含在乙個簡單環內

邊雙聯通圖:不存在割邊的圖。判定:任意一條邊包含在乙個環內

點雙聯通分量:極大點雙聯通圖,即不存在包含這個點雙聯通子圖的更大的雙聯通子圖。

邊雙聯通分量:同6,點改為邊。

邊雙縮點:去掉割邊,乙個聯通塊縮成乙個點。

點雙縮點:點雙縮成乙個點,與割點連成圖。

強連通分量的樹邊、前向邊、後向邊、橫插邊:1搜尋樹上的邊,2連到子孫,3連到祖先,4連到不在同一棵子樹的點。

割點和點雙

void

tarjan

(int u)

stk[

++st]

= u;

for(

int i = point[u]

; i !=-1

; i = edge[i]

.nxt)}}

}else

}}

看這樣一張圖:

如果e ls

eelse

else

時用l ow

[v]low[v]

low[v]

更新l ow

[u]low[u]

low[u]

,這張圖就是一整個點雙了。然而並不是,3明顯是乙個割點。

割邊和邊雙

void

tarjan

(int u,

int in_e)

int v = edge[i]

.v;if

(!dfn[v])}

else

}}

求邊雙只要求出割邊之後dfs

dfsdf

s一遍就行了。

強聯通分量

強連通分量的演算法是找後向邊和橫插邊構成的環。在棧中記錄當前節點的祖先,和能到達當前節點祖先的點。如果有邊指向棧中節點,那麼就可以用棧中節點的dfn

dfndf

n更新當前節點的low

lowlo

w。

void

tarjan

(int u)

else

if(instk[v])}

if(low[u]

== dfn[u])}

}}

一、poj 2942

knights of the round table

點雙+奇環判定

二、poj 3694

network

邊雙,low的並查集用法

強聯通分量

有向圖中 u可達 v不一定意味著v可達 u.相互可達則屬於同乙個強連通分量 strongly connected component,scc 最關鍵通用部分 強連通分量一定是圖的深搜樹的乙個子樹。1.演算法思路 基本思路 這個演算法可以說是最容易理解,最通用的演算法,其比較關鍵的部分是同時應用了原圖...

強聯通分量

include include include include include include include include using namespace std struct edge vectora 80005 b 80005 node 80005 int he 80005 int n,m,...

強聯通分量

2020 10 31 內容來自oi wiki和yu xuan 的講課 強聯通分量 個人理解 tarjan 演算法是由棧來實現的 dfn u dfs序 low u 以u為根的子樹,最小的dfs序那麼會出現 3 中情況 void tarjan int u else if vis v 1 low u mi...