tarjan算法入门(1)
今天开始学习tarjan,结合的资料的是刘汝佳的训练指南和https://www.byvoid.com/blog/tag/%E5%9C%96%E8%AB%96(byvoid)
的博客,学习了1个多小时,了解tarjan算法的解决步骤和思路,但是代码还是有点问题
先把模版放上来,继续切cf,其余问题明天继续
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <stack> using namespace std; const int maxn = 1e5; vector<int>g[maxn]; int pre[maxn], lowlink[maxn],sccno[maxn], dfs_clock,scc_cnt; stack<int>s; void dfs(int u) { pre[u] = lowlink[u] == ++dfs_clock; s.push(u); int i; for(i = 0; i < g[u].size(); i++) { int v = g[u][i]; if(!pre[v]) { dfs(v); lowlink[u] = min(lowlink[u], lowlink[v]); } else if(!sccno[v]) { lowlink[u] = min(lowlink[u], pre[v]); } } if(lowlink[u] == pre[u]) { scc_cnt++; for(;;) { int x = s.top(); s.pop(); sccno[x] = scc_cnt; if(x == u) break; } } } void find_scc(int n) { dfs_clock = scc_cnt = 0; memset(sccno, 0, sizeof(sccno)); memset(pre, 0, sizeof(pre)); int i; for(i = 0; i < n; i++) if(!pre[i]) dfs(i); }