演算法偽**描述: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...