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

2022-06-04 10:45:11 字數 1490 閱讀 1414

tarjan求強連通分量

在乙個有向圖中,如果某兩點間都有互相到達的路徑,那麼稱中兩個點強聯通,如果任意兩點都強聯通,那麼稱這個圖為強聯通圖;乙個有向圖的極大強聯通子圖稱為強聯通分量

演算法可以在

的時間內求出乙個圖的所有強聯通分量。

表示進入結點

的時間

表示從所能追溯到的棧中點的最早時間

如果某個點

已經在棧中則更新

否則對進行回溯,並在回溯後更新

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

intn,m,tot,ind,ans;

int dfn[200005],low[200005],last[200005

];bool ins[200005

];stack

s;struct

hhe[

500005

];void add(int fr,int

to)void tarjan(int

now)

else

if(ins[e[i].to])low[now]=min(low[now],dfn[e[i].to]);

if(dfn[now]==low[now])

while(j!=now);

ans=max(ans,cnt);

}}int

main()

for(i=1;i<=n;i++)

if(!dfn[i]) tarjan(i);

printf("%d

",ans);

return0;

}

tarjan求割點

在乙個無向圖中,如果刪掉點

後圖的連通塊數量增加,則稱點

為圖的割點

對於搜尋樹上的非根結點

,如果存在子節點

滿足,即

向上無法達到

的祖先,則

為割點。

對於搜尋樹上的根節點

,若它的子節點數

,則為割點。

void tarjan(int x,int

fa)

else

if(e[i].to!=fa) low[x]=min(low[x],dfn[e[i].to]);}}

tarjan求割邊

對於當前結點

,若鄰接點中存在結點

滿足,則

為割邊。

void tarjan(int x,int

fa) }

}

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

強連通分量 tarjan

洛谷 p2812 校園網路 洛谷 p3387 縮點 include include include include include using namespace std struct arrbot 1100000 d 1100000 int head 20000 h 20000 stack 200...

強連通分量 tarjan

struct enodeedge maxm int p maxn ec void inserte int u,int v,int w int dfn maxn ctime,low maxn 時間戳,時間戳計數,祖先時間。int gid maxn gc 分量陣列,分量計數。bool ins maxn ...