>Link
ybtoj有向图缩点
luogu P3387
>解题思路
根据 “允许多次经过一条边或者一个点,但是重复经过的点,权值只计算一次” ,我们可以知道如果我们到达了一个强连通分量中的其中任意一个点,我们都必须走完这个强连通中的其他所有点才算更优,且得到的权值是整个强连通分量的权值之和。也就是说,我们走过一个点,就相当于把它所处的强连通分量走过了。
所以我们要对有向图缩点,找出其中每一个强连通分量然后缩成一个点,这样我们就得到了一个新的有向无环图。这时要找一条经过权值最大的路径就容易了,因为不用考虑一条路径要经过同一个点两次,用拓扑+DP实现
如何找强连通分量?
(我先总结下书上的东西)
- 树上“正常”的边是 树枝边
- 与“正常”边反过来走的是 后向边
- 把“同一层”的节点连起来的是 横叉边
- 跨越了“几层”连起来的是 前向边
我们可知树枝边不一定产生强连通,前向边对强连通没有任何作用(可以直接通过树枝边到达),我们只用考虑后向边和横叉边会不会产生强连通就行了
这里用 t a r j a n tarjan tarjan来找
d f n x dfn_x dfnx表示当前节点的 d f s dfs dfs序, l o w x low_x lowx表示当前节点的子树中 d f n dfn dfn的最小值(当前节点往下走可以走到的 d f n dfn dfn最小的点)
用 d f s dfs dfs遍历整个图,不断更新 d f n dfn dfn和 l o w low