圆方树学习笔记
圆方树学习笔记
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]);
    }
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号