Tarjan求強連通 縮點 割點 割邊

2021-09-26 05:53:35 字數 1258 閱讀 2853

1.如果乙個無向圖中每個頂點從所有其他頂點都是可達的,則稱該圖是連通的。圖的連通分量「從....可達」的等價類.

2.如果乙個有向圖中任意兩點互相可達,則該有向圖是強連通的「相互可達」等價類

3.有向圖g=(v,e)的強連通分量是乙個最大節點集合c包含於v,對於該集合中任意節點u,v,節點u,v可以相互到達

4.深度優先搜尋樹,每個強連通分量對應一顆深度優先樹

5.u,v在圖g中可以相互到達當且僅當他們在圖g的轉置圖中可以相互到達

注釋掉的**為強連通圖判定

既cnt==1;

注意縮點時:只有出度為0的點只有1個時,這個點才能被其他所有點到達

判斷強連通以及縮點時不能反向建邊因此注釋掉

#include#include#include#include#include#include#include#define ll long long

using namespace std;

const int maxn=1e5+5;

int low[maxn],dfn[maxn],now,root=1;

bool vis[maxn];

int belong[maxn];

int out[maxn];

int cnnt[maxn];

vectorg[maxn];

setans;//縮點

int cnt;//統計強連通分量個數,既深度優先搜尋森林中有多少顆樹

void init()

void addedge(int u,int v)

stackst;//存分量圖節點

void tarjan(int u)

else if(temp==1)

cout《求割點,割邊時需要反向建邊

割點:無向圖刪掉一點和它所關聯的邊,圖的連通性增加。

割邊(橋):無向圖刪掉一邊,圖的連通性增加。

求割點-

根節點有多個子樹 -

非根節點

u,當兒子節點v:

dfn[u] <= low[v]

求割邊割邊等價於dfn[u]

模板如下

void tarjan(int u,int fa)

else if(u!=root&&dfn[u]<=low[v])

} else

}}

部分內容引自演算法導論

tarjan求割邊割點

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

強連通割點割橋模板

如果u是根節點,只要它有兩個子節點就說明是割點,否則,滿足 u,v 為樹枝邊 或稱父子邊,即u是v的父親 使得dfn u low v 橋無向邊 u,v 當且僅當 u,v 為樹枝邊,且滿足dfn u include include include include include include inc...

學習整理 Tarjan 強連通分量 割點 割邊

tarjan求強連通分量 在乙個有向圖中,如果某兩點間都有互相到達的路徑,那麼稱中兩個點強聯通,如果任意兩點都強聯通,那麼稱這個圖為強聯通圖 乙個有向圖的極大強聯通子圖稱為強聯通分量。演算法可以在 的時間內求出乙個圖的所有強聯通分量。表示進入結點 的時間 表示從所能追溯到的棧中點的最早時間 如果某個...