我美好的早上就被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...