有向連通分量的Tarjan演算法

2021-06-07 15:16:59 字數 1723 閱讀 1479

演算法偽**描述:tarjan(root)

1、初始化 def , low, map

2、stack<- root // 將 root 節點入棧

3、 對 與 root 相連的每個 節點 p 如果 p  在 stack 中 那麼 low[root] = min(low[root], def[p]);並且 call  tarjan(p)

4、 如果對 與 root 相連的每個 節點 p 如果 p 不在 stack 中 那麼 low[root] = min( low[p], low[root])

5 、當 low[root] = def[roo] 時,輸出棧裡 在 root 之上的 所以 元素 為乙個連通分量

**如下:

1:鄰接矩陣儲存

#include #include#includeusing namespace std;

#define v 100

int map[v][v]; // 存放地圖

int def[v]; // def[i] 記錄 i 節點的訪問時間

int low[v]; // 記錄 i 節點連通分量 所在集合的能追朔到的最小 def

bool instack[v];// 標記 i 是否在 堆中, 在 為 1 , 不在 為 0

int count ;// 連通分量的個數

int temp;//

vectorresult[v];// 儲存連通分量的結果集

stackstack_v ;

int index = 0;

int min ( int a, int b)

void tarjan ( int map[v], int def[v], int low[v],int root, int n)

if( instack[i] == true)

} }if( def[root] == low[root] )while(temp != root);

cout<>n>>e;

for( int i =0; i < e; i++)

tarjan(map,def,low,1,n);

cout<

2:鄰接表儲存

#include#includeusing namespace std;

#define m 2000 //題目中可能的最大點數

int stack[m],top=0; //tarjan 演算法中的棧

bool instack[m]; //檢查是否在棧中

int dfn[m]; //深度優先搜尋訪問次序

int low[m]; //能追溯到的最早的次序

int componetnumber=0; //有向圖強連通分量個數

int index=0; //索引號

vector edge[m]; //鄰接表表示

vector component[m]; //獲得強連通分量結果

int min(int a, int b)

void tarjan(int i)

{ int j;

dfn[i]=low[i]=index++;

instack[i]=true;

stack[++top]=i;

for (int e=0;e

tarjan演算法 連通分量

tarjan演算法 1 low maxn 乙個節點的dfn值 同乙個連通分量中這個節點可以回到的最小時間戳 2 dfn maxn 按照dfs的順序訪問到該節點的時間戳 3 對乙個節點來講 1 如果沒有被訪問過,即先對其遞迴呼叫tarjan函式,然後計算這個節點的上乙個節點,即這條邊的from節點的l...

強連通分量Tarjan演算法

o v e 通常的tarjan寫法是有個dfn陣列跟乙個instack陣列,我精簡了下 把這兩個陣列都刪去了,用更簡便的寫法代替,也省了空間。int low maxn 記錄這棵樹能到達的最早祖先 其實不一定是最早,但不影響使用 int time 時間戳 int num 連通分量的個數 int bel...

強連通分量 tarjan演算法

強連通分量 tarjan演算法 有向圖強連通分量 在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected com...