tarjan求強聯通分量

2021-07-02 19:39:51 字數 833 閱讀 7581

變數含義說明:

pre[i]:i點的被訪問的時鐘編號,被分配後保持不變

low[i]:i點能訪問的最先的點的時鐘編號,隨子節點改變

scc_no[i]:i點所在的強聯通分量的編號

dfs_clock:時鐘序號,每訪問乙個新的點時都增長1

scc_cnt:強聯通分量的編號

棧stk:每訪問乙個節點都壓入棧中

他的步驟如下所述:

從根節點開始訪問

為此新點的pre和low賦值現在的時間

遍歷訪問它的子節點

如果此點未被訪問,則跳回第二步,然後跟新其low值

如果已訪問但其未進入強聯通編號,則用此點pre更新父節點的low值

遍歷完子節點後,如果發現此點的low值和pre值相等,則說明它是所在強聯通分量的擁有最小時間訪問編號的那個點,於是可以從棧stk中彈出他的後續所有節點,並為他們賦值乙個新的強聯通分量的編號。

具體**如下;

@frosero

#include

#include

#include

#include

int low[202],pre[202],scc_no[202],dfs_clock,scc_cnt;

vector

mps[202];

stack

stk;

void tarjan(int s)

else

if(!sccno[v])

}if(pre[s] == low[s])

}}void fin_circle(int s)

求強聯通分量 Tarjan演算法

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...

強聯通分量 tarjan

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

Tarjan演算法 強聯通分量

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