強聯通分量 tarjan

2021-07-06 10:23:34 字數 794 閱讀 8915

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

每個節點都會入棧一次,每條邊訪問一次,所以o(m+n)的效率。

#include #include#define node 100

using namespace std;

struct edge

edge[node*node];

int head[node];

int low[node]; //low[u]表示訪問該強聯通分量最早的時間

int time[node]; //訪問節點的時間順序,標識是否訪問過

int in[node]; //是否在棧中

int t=0,n,cnt=0,ret=0;

int stack[node],top=0;

void addedge(int u,int v,int w)//鄰接表(頭插法)

void dfs(int u)

else if(in[v]&&low[u]>low[v]) //u找到了比自己更早訪問的子節點

}if(time[u]==low[u]) //判斷是否是強聯通分量的第乙個節點

tarjan();

}return 0;

}

Tarjan演算法 強聯通分量

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

tarjan求強聯通分量

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

求強聯通分量 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...