tarjan缩点(洛谷P387)
此题解部分借鉴于 九野的博客 题目分析 给定一个 \(n\) 个点 \(m\) 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。 假如没有后面这条限制的话,那图一定是一个 无环图 。因为有环的话我可以一直在环上跑,所以答案就没有一个上界 没有环的话我萌可以很自然地想到一个 \(O(n)\) 的 拓扑 \(dp\) 做法,先做入度为 \(0\) 的点,更新入度不为 \(0\) 的点,把更新后入度为 \(0\) 的点加入队列里,继续做之前的事情 现在考虑有环怎么做 有一个贪心的思路是,到环上就先把 环上的点 都走完,再从 环上任意一点 出发 其实这个环可以看做一个 大点 ,也就是我们今天要介绍的主角 \(\to\) 缩点 tarjan缩点 下面这张图是从 九野的博客 那 copy 过来的 把可以互相抵达的 点集 叫做一个 连通分量 最大的那个可以互相抵达的点 点集 即为 强连通分量 特别的,单个的点也可以是 强连通分量 比如说 : \(\{ 4, 5 \}\) 是一个 联通分量 ,而 ${4,5,6 } $ 则是一个 强连通分量 (一个大点) tarjan的过程就是通过 dfs 找强连通分量(大点)的过程 对图 dfs 一下,遍历所有未遍历过的点 ,会得到一个 有向树