tarjan 模板 縮點

2022-05-09 15:20:54 字數 2309 閱讀 8066

傳送門:

首先呢,tarjan找乙個圖的強連通分量是基於對圖的dfs的。這中間開了乙個dfn代表dfs序,還有個low代表該節點在dfs形成的樹中能到達的最近的根。然後分情況進行更新(一會兒看我**吧)。

為了記錄乙個強聯通分量,我們還要在開乙個棧來儲存當前查詢的強連通分量。如果low[x] == dfn[x],那就說明這個點在dfs樹種不能往上再爬了,於是就開始彈棧。

對於這道題呢,先用tarjan找出強聯通分量,然後縮點建立新圖。可以發現,建立的新圖是乙個拓撲圖,所以可以拓撲排序後在圖上dp,然而我這麼寫wa了。翻題解的時候看到了乙個更簡單的方法:記錄每乙個點的入度,對於每乙個入度為0的點用spfa跑一遍最長路,然後在所有最長路中取乙個max即可。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10

using

namespace

std;

11#define enter printf("\n")

12#define space printf(" ")

13#define mem(a) memset(a, 0, sizeof(a))

14 typedef long

long

ll;15 typedef double

db;16

const

int inf = 0x3f3f3f3f;17

const db eps = 1e-8;18

const

int maxn = 1e5 + 5;19

inline ll read()

2024

while

(isdigit(ch))

2528

if(last == '

-') ans = -ans;

29return

ans;30}

31 inline void

write(ll x)

3237

38 vectorv[maxn];

39int

n, m, a[maxn];

4041

int dfn[maxn], low[maxn], cnt = 0;42

bool

in[maxn];

43 stackst;

44int col[maxn], ccol = 0

, val[maxn];

45void tarjan(int

now)

4656

else

if(in[v[now][i]]) low[now] = min(low[now], dfn[v[now][i]]); //

這個點找到了他所在聯通塊的祖先節點 57}

58if(low[now] == dfn[now]) //

開始找出聯通塊中的所有點

59while(x !=now);67}

68return;69

}7071 vectorv2[maxn];

72bool

du[maxn];

73void newgraph(int

now)

7482

return;83

}848586

int ans = 0;87

88int

dis[maxn];

89bool

vis[maxn];

90void spfa(int

s)91

106}

107}

108}

109for(int i = 1; i <= ccol; ++i) ans = max(ans, dis[i]); //

更新答案

110}

111int

main()

112120

for(int i = 1; i <= n; ++i) if(!dfn[i]) tarjan(i); //

有的點從乙個定點出發可能走不到,就都得判斷是否走過

121for(int i = 1; i <= n; ++i) newgraph(i); //

建立新圖

122for(int i = 1; i <= ccol; ++i) if(!du[i]) spfa(i); //

對於每乙個入度為0的點,跑最長路

123write(ans); enter;

124return0;

125 }

Tarjan 縮點 模板

縮點以後,整張圖變為dag 有向無環圖 此時運用拓撲排序 求出度入度就可以完成許多事 題目 include include include include include include define ll long long using namespace std const int maxn 1...

學習 模板 tarjan縮點

我美好的早上就被tarjan毀掉了 微笑 放資料qwq謝謝你們讓我學會了tarjan 前兩個還是讓我了解了tarjan而最後乙個可就厲害了還讓我鞏固了topo sort dag 上的dp!學習筆記詳見注釋quq 1 include2 include3 include4 define maxn 100...

tarjan縮點 求橋模板

這麼一看縮點用tarjan也沒必要啊,用之前那個存反向邊dfs兩次的做法就行了 縮點過程就是遍歷邊,兩側不同scc就加邊 include pragma comment linker,stack 1024000000,1024000000 include include include include...