• 浅谈基环树(环套树)


    浅谈基环树(环套树)

    本篇随笔简单讲解一下算法竞赛中的基环树。也叫环套树。


    一、基环树概念

    其实我个人更喜欢叫它基环树。更好理解。

    它的标准定义是:具有N个点N条边的连通图。

    如果不保证联通,它就会成为基环树森林。

    上张图直观理解一下。

    这就是一棵基环树。

    如果我们把中间那个醒目的环断开任意一条边,它就会成为一棵树,如果我们把这个环全部断掉,就会成为一个森林。


    二、内向树和外向树

    啥?树还会害羞么?

    所谓内向树的定义是每个点有且只有一条出边。也就是这棵树给人的大体感觉是向内的。

    所谓外向树的定义是每个点有且只有一条入边。也就是这棵树给人的大题感觉是外向的。

    比如上面的基环树,变成内向树就是:

    变成外向树就是:

    嗯,也就是基环树变成有向图的一种子定义。


    三、基环树的处理

    根据上面的定义介绍,我们可以感觉到,基环树虽然被单独拿出来讨论,但是其本质上还是一个比较简单且好理解的数据结构之一。所以它只能适当地提升题目难度,并不能说一个树的题变成基环树就大大增强了。

    一些经典例题有:

    基环树直径、基环树两点之间距离,基环树DP,等。

    这些模型的解决通法一般是:

    断环成树,然后将若干棵树处理好之后,再考虑环对答案的影响。也就是将环、树分开讨论解决问题。这时,用”环套树“这个名词来形容基环树,很是容易理解。

    比如例题:

    ZJOI2008骑士

    这道题是基环树DP的题目,在这道题中,我们对每一棵基环树断掉环上的一条边,然后对断开的两个点分别跑树形DP,就可以得到正确的答案。

    总的来说,基环树的一种常用处理方式是”断环“。

    再比如例题:

    IOI2008岛屿

    这道题要求基环树的最长链。

    基环树的最长链有两种情况:

    第一种是在某棵树里,不经过环。

    第二种是经过环。

    所以我们可以先用一次DFS找出环,在每个环上节点出发处理树上的最长路径,并计算出从根节点最远到达节点距离根节点的距离。显然,如果经过环的话,肯定要经过这个最大的距离。

    所以比较即可。

    总的来说,基环树的另一种常用处理方式是分类讨论。

  • 相关阅读:
    配置iis 8.0 遇到的问题
    easy ui datagrid 下拉框级联绑定
    Flutter
    Flutter
    mingw
    Flutter 配置windows桌面开发环境
    Flutter -- 输入法键盘盖住控件出现A RenderFlex overflowed by 27 pixels on the bottom
    PowerBuilder -- 连接sqlite
    idea
    PowerBuilder -- 事件与函数的触发
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13815549.html
Copyright © 2020-2023  润新知