圆方树学习笔记
圆方树学习笔记
PS:这里的圆方树是广义的圆方树,而非指仙人掌上的圆方树。
圆方树想法很简单,将”路径中必须经过的点“这一概念转化到了树上。
思路很简单,对于一个点双连通分量,新建一个方点,将所有连通分量里的点作为圆点连到方点上。
代码实现就是在\(Tarjan\)求割点的代码里加一个栈记录连通分量里的点。
void Tarjan(int u){
low[u] = dfn[u] = ++clk; stk[++top] = u;
for(auto v:g[u]){
if(!dfn[v]){
Tarjan(v); low[u] = min(low[u],low[v]);
if(low[v] == dfn[u]){
++cnt;
for(int _ = 0;_ != v;--top){
_ = stk[top];
Add(cnt,_);
}
Add(cnt,u);
}
}else low[u] = min(low[u],dfn[v]);
}
}