tarjan演算法筆記

2021-09-25 20:19:10 字數 1541 閱讀 8122

tarjan演算法可以用來求強連通塊的塊數,判斷條件是low[x] = dfn[x];

注意點:縮點後是將強連通塊當作點,所以重建圖的時候,發現原圖2點不在同一強連通塊就可以按照原圖的方向鏈結2個超級點。

建圖可以能有重邊但是大部分不會對解題產生影響。如果有需要可以用set去重。

tarjan 當 low[x] = dfn[x] 時,彈出 x 包括x前面的元素,這些元素共同組成乙個量連通塊。不要忘記標記他們已經被彈出了

vis[stack[top--]] = 0; // 彈出
p3387 【模板】縮點

#include#include#include#include#include#include#include#include#include#define ll long long

#define max(a,b) a > b ? a : b

#define min(a,b) a < b ? a : b

#define me(a,b) memset(a, b, sizeof(a))

#define iosos ios::sync_with_stdio(false)

#define fo(a,b,c) for(int a = b; a < c; a++)

using namespace std;

const int maxn = 1e5 + 10;

const int maxm = maxn << 1;

const int inf = 0x7f7f7f7f;

int h[maxn], h1[maxn], p, p1;

int point[maxn], w[maxn], color[maxn], sum;

int n, m;

int dfn[maxn], low[maxn], cnt;

int stack[maxn], top;

int vis[maxn];

int deg[maxn];

int dp[maxn];

struct edge e[maxm], e1[maxm];

inline void add(int u, int v)

inline void add1(int u, int v)

void tarjan(int x) else if(vis[v])

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

int main()

fo(i,1,n+1) if(!dfn[i]) tarjan(i);

fo(i, 0, p) }

queueq;

fo(i,1,sum+1) dp[i] = w[i];

for(int i = 1; i <= sum; i++)

} while(!q.empty())

} int ans = 0;

fo(i,1,sum+1) ans = max(ans, dp[i]);

cout

}

Tarjan 演算法筆記

tarjan演算法 tarjan演算法屬於圖論中的乙個演算法,主要用來求乙個圖中的強連通分量,之後就可以做很多事,比如說縮點 求雙聯通分支等。強連通 在乙個有向圖中,對於幾個點,如果它們能夠互相到達,那麼稱它們強連通。強連通分量 可以這樣理解 把乙個圖里的點分成幾坨,每坨中的點都能夠互相到達 他們強...

演算法學習筆記 Tarjan演算法

演算法資料結構 三個步驟完成強連通分量分解的kosaraju演算法 我們來思考乙個問題,對於強連通分量分解的演算法來說,它的核心原理是什麼?如果你看過我們之前的文章,那麼這個問題對你來說應該不難回答。既然是強連通分量,意味著分量當中每個點都可以互相連通。所以我們很容易可以想到,我們可以從乙個點出發,...

Tarjan演算法 學習筆記

tarjan演算法一般用於有向圖裡強連通分量的縮點。強連通分量 有向圖裡能夠互相到達的點的集合。大概是這麼個意思,自己意會 因為能夠互相到達,所以巨集觀上我們可以把它們看成乙個點,邊權也相應的加起來即可。下面是tarjan過程的 解釋 我們開兩個陣列,分別為dfn和low。dfn表示此點的時間戳,l...