10392: 学习系列 —— 基环树
[Creator : ]
Description
基环树(pseudotree)
就是一个 $n$ 个点 $n$ 条边的连通图。简单来说,就是一个树加上了一条边形成了一个环。所以基环树上的问题大多数都是先处理以环上的点为根节点的子树的值,然后在环上做 dp 之类的东西
Input
Output
一般处理思路
以无向图为例子。1. 大体方法
一般方法的:- 找到唯一的环;
- 对环之外的部分按照若干棵树处理;
- 考虑与环一起计算。
2. 找环
可以是DFS,并查集,拓扑排序。下面我们用一个动画来演示DFS找环的过程。- 从任意一点开始搜索;
- 每次拓展到的点涂为灰色,回溯的点涂为黑色;
- 重复第一、二步,直到通过一条未经过过的边拓展到一个灰色节点;
- 将拓展到的灰色节点涂为红色,函数返回 true;
- 将经过的回溯时经过的节点涂为橙色,函数返回 true;
- 重复第 5. 步,直到回溯到被涂为红色的节点,函数返回 false,算法结束。
注意到,上面的模拟过程中,以节点 10 为根的子树并没有被遍历,是因为 DFS 的实现本身便是一路到底,所以可能并不能遍历整颗基环树。