求強聯通分量 Tarjan演算法

2022-09-01 05:39:07 字數 629 閱讀 1565

const

int maxn=5010

;const

int maxm=2500000

;struct

edge

edge[maxm];

inthead[maxn],tot;

intlow[maxn],dfn[maxn],stack[maxn],belong[maxn];

intindex,top;

intscc;

bool

instack[maxn];

intnum[maxn];

void addedge(int u,int

v)void tarjan(int

u)

else

if(instack[v]&&low[u]>dfn[v])

low[u]=dfn[v];

}if(low[u]==dfn[u])

while(u!=v);

}}void solve(int

n)//n代表點的個數,點的標號從1到n,最後得到的結果在belong陣列中,記錄的是改點屬於的強聯通分量的標號,scc代表強聯通分量的個數

}void

init()

tarjan求強聯通分量

變數含義說明 pre i i點的被訪問的時鐘編號,被分配後保持不變 low i i點能訪問的最先的點的時鐘編號,隨子節點改變 scc no i i點所在的強聯通分量的編號 dfs clock 時鐘序號,每訪問乙個新的點時都增長1 scc cnt 強聯通分量的編號 棧stk 每訪問乙個節點都壓入棧中他...

Tarjan演算法 強聯通分量

1 基礎知識 在有向圖g,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連...

強聯通分量 tarjan

tarjan演算法思想 dfs節點的時候,用time記錄訪問順序,則父節點會先於子節點訪問。那麼節點u遞迴的過程中找到了父節點 先訪問的 形成乙個環路,這個環路上的所有節點就是乙個強聯通分量。low的作用是用強聯通分量上的最先訪問的節點 訪問到的父節點 得time作為整個強聯通分量所有節點的時間。並...