圆方树学习笔记

圆方树学习笔记

PS:这里的圆方树是广义的圆方树,而非指仙人掌上的圆方树。

圆方树想法很简单,将”路径中必须经过的点“这一概念转化到了树上。

思路很简单,对于一个点双连通分量,新建一个方点,将所有连通分量里的点作为圆点连到方点上。

1126418-20190711015718548-2063534813.png

代码实现就是在\(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]);
    }
}
posted @ 2021-01-25 15:15  趁着胆子小  阅读(79)  评论(3编辑  收藏  举报
//explotion effect (unabled)