學習 模板 tarjan縮點

2022-04-28 17:30:08 字數 1589 閱讀 5167

我美好的早上就被tarjan毀掉了(微笑

放資料qwq謝謝你們讓我學會了tarjan

前兩個還是讓我了解了tarjan而最後乙個可就厲害了還讓我鞏固了topo sort + dag 上的dp!

學習筆記詳見注釋quq

1 #include2 #include3 #include4

#define maxn 10010

5#define maxm 100010

6using

namespace

std;

7int n, m, num = 0, tim = 0, top = 0, cnt = 0;8

intnode[maxn], sd[maxn], head[maxm], dfn[maxn], low[maxn];9//

node 點權 sd 記錄該點在哪個強連通分量中 head 原圖的每一條邊的起點 dfn時間戳 low能追溯到的最早的棧中節點編號

10int sta[maxn], hear[maxm], dist[maxn], in

[maxn];

11//

sta 棧 為了儲存整個強連通分量 hear 是新圖中的每一條邊的起點 dist 走到當前點(縮環成點結束後)的最大權值和 in每個點(依舊是縮點結束後)的入度

12bool vis[maxn];//

記錄當前該節點是否在棧中

13struct

edge e[maxm], ed[maxm];

16int read()

19while(ch <= '

9' && ch >='

0')

20return x *f;21}

22void add(int

from, int to)

28void readd(int

from, int to)

35void tarjan(int

x) 45

else

if(vis[v]) low[x] = min(low[x], dfn[v]);//

low[x] = min(low[x], low[v]) 兩種寫法等價 46}

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

57}58int topo() 66}

67while(!q.empty()) 76}

77int ans = 0;78

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

79 ans =max(ans, dist[i]);

80return

ans;81}

82int

main()

90for(int i = 1; i <= n; i++)

93for(int i = 1; i <= m; i++)

97 printf("

%d", topo());//

轉化為dag上得dp

98return0;

99 }

Tarjan 縮點 模板

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

tarjan 模板 縮點

傳送門 首先呢,tarjan找乙個圖的強連通分量是基於對圖的dfs的。這中間開了乙個dfn代表dfs序,還有個low代表該節點在dfs形成的樹中能到達的最近的根。然後分情況進行更新 一會兒看我 吧 為了記錄乙個強聯通分量,我們還要在開乙個棧來儲存當前查詢的強連通分量。如果low x dfn x 那就...

tarjan縮點 求橋模板

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