基环树

基环树

转载请注明出处,部分内容引自 cly_none 大神的博文。

基环树,也是环套树,简单地讲就是在树上再加一条边。它形如一个环,环上每一个点都有一颗子树的形式。因此,对基环树的处理大部分就是对树处理和对环处理。显然,难度在于后者。

扣环

这是几乎所有基环树处理的第一步。扣环的方式多种多样,各有千秋,反正都是 O(n) 的。

 

struct edge{
    int nxt,to,w;
}e[N<<1];
int tot,cnt,rt;
int fir[N],vis[N],lop[N],dist[N],inl[N];
int getlop(int u,int fa){
    if(vis[u]){
        rt=u;return 1;
    }
    vis[u]=1;
    int tmp;
    for(int i=h[u];i;i=e[i].nxt){
        if(e[i].to==fa) continue;
        if(tmp=getlop(e[i].to,u),tmp){
            if(tmp==1){
                lop[++cnt]=u;
                dist[cnt]=e[i].w;
                inl[u]=1;
                if(u!=rt) return 1;
            }
            return 2;
        }
    }
    return 0;
}
View Code

 

posted @ 2023-11-28 21:26  青阳buleeyes  阅读(13)  评论(0编辑  收藏  举报