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