學習筆記 割點 tarjan

2021-09-24 18:15:43 字數 928 閱讀 5168

給出乙個n個點,m條邊的無向圖,求圖的割點。

那麼割點是什麼呢,就是說,如果你去掉了這個點和所有與這個點相連的邊之後,整張圖的連通塊數量增加了,這個點就是乙個割點

怎麼做呢,每次列舉乙個點,dfs一遍,看有沒有增加連通塊,好像是n方,n有2w那麼大,會炸啊

運用這個演算法,可以只dfs一遍,或者只需要每個點遍歷一遍,就可以求出所有的割點

那麼怎麼實現呢?

對於根節點,只要它有2個及以上的兒子,顯然它就是乙個割點

對於不是根節點的節點,我們先dfs一遍,可以得出乙個dfs樹,有一些邊是沒有經過的,我們把它叫做虛邊

設定乙個dfn陣列儲存dfs序,乙個low陣列儲存i及它的子樹中通過虛邊能走到的dfs序最小的點

當我們遍歷到乙個點u時,對於它的兒子,如果它的兒子的low在u之後,那麼u就是乙個割點

那怎麼求low陣列呢

預設low[u]=dfn[u],即只能回溯到自身,然後遍歷u的每一條邊(u,v)

如果v未訪問過,就dfs(v),然後low[u]=min(low[u],low[v])

如果v已經已經訪問過,說明這條邊是虛邊,low[u]=min(low[u],dfn[v])

#include#define v a[i].to

using namespace std;

int n,m,x,y,head[20010],cnt,low[20010],dfn[20010],cut[20010],k,so;

struct edgea[200010];

void add(),head[x]=cnt,a[++cnt]=(edge),head[y]=cnt;}

void dfs(int u,int fa)

else low[u]=min(low[u],dfn[v]);

}}int main()

學習筆記 tarjan求割點

都口胡了 求割邊,就順便口胡 求割點好了qaq 的定義同 求有向圖強連通分量.列舉當前點 的所有鄰接點 1.如果某個鄰接點 未被訪問過,則訪問 並在回溯後更新 2.如果某個鄰接點 已被訪問過,則更新 對於當前節點 如果 為搜尋樹中的根節點,若它的子節點數 根是多棵子樹上節點的唯一連通方式 則 為割點...

《學習筆記》 tarjan 求割點(割頂)

go to the problem 割點 在乙個無向圖中,如果有乙個頂點集合,刪除這個頂點集合以及這個集合中所有頂點相關聯的邊以後,圖的連通分量增多,就稱這個點集為割點集合。如果某個割點集合只含有乙個頂點x 也即是乙個割點集合 那麼x稱為乙個割點。割點 給出乙個n個點,m條邊的無向圖,求圖的割點。輸...

割點 割邊 tarjan

洛谷割點模板題 傳送門 割邊 在連通圖中,刪除了連通圖的某條邊後,圖不再連通。這樣的邊被稱為割邊,也叫做橋。割點 在連通圖中,刪除了連通圖的某個點以及與這個點相連的邊後,圖不再連通。這樣的點被稱為割點。dfs搜尋樹 用dfs對圖進行遍歷時,按照遍歷次序的不同,我們可以得到一棵dfs搜尋樹。樹邊 在搜...