学习了tarjan算法,觉得这个算法真的是挺强大的,然而蒟蒻并不会用 ,先学习着写一篇博客作为记录。
学习tarjan的点觉得主要在于两个数组的理解—— d f n , l o w dfn,low dfn,low数组
d f n dfn dfn数组,用于记录 d f s dfs dfs序,也就是这个点最早什么时候被dfs搜索到。
l o w low low数组,用于记录其及其子树中的点能回溯到的点的最小 d f s dfs dfs序
这两个数组引出了很多很多应用
tarjan模板
const int maxn = 1e5+5;
struct Edge{
int u,v,nxt;
}edge[maxn];
int head[maxn],tot;
inline void addedge(int u,int v){
edge[++tot] = {
u,v,head[u]};
head[u] = tot;
}
bool vis[maxn];
int dfn[maxn],sta[maxn],low[maxn],stalen,num,color[maxn],dfnnum;
void tarjan(int u){
dfn[u] = low[u] = ++dfnnum;
sta[stalen++] = u; vis[u] = true;
for(int i = head[u