浅谈基环树(环套树)

浅谈基环树(环套树)

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


一、基环树概念

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

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

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

上张图直观理解一下。

这就是一棵基环树。

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


二、内向树和外向树

啥?树还会害羞么?

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

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

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

变成外向树就是:

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


三、基环树的处理

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

一些经典例题有:

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

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

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

比如例题:

ZJOI2008骑士

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

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

再比如例题:

IOI2008岛屿

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

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

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

第二种是经过环。

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

所以比较即可。

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

原文地址:https://www.cnblogs.com/fusiwei/p/13815549.html