有向图缩点【tarjan】【强连通分量】【拓扑】

>Link

ybtoj有向图缩点

luogu P3387


>解题思路

根据 “允许多次经过一条边或者一个点,但是重复经过的点,权值只计算一次” ,我们可以知道如果我们到达了一个强连通分量中的其中任意一个点,我们都必须走完这个强连通中的其他所有点才算更优,且得到的权值是整个强连通分量的权值之和。也就是说,我们走过一个点,就相当于把它所处的强连通分量走过了。

所以我们要对有向图缩点,找出其中每一个强连通分量然后缩成一个点,这样我们就得到了一个新的有向无环图。这时要找一条经过权值最大的路径就容易了,因为不用考虑一条路径要经过同一个点两次,用拓扑+DP实现

如何找强连通分量?
(我先总结下书上的东西)

  1. 树上“正常”的边是 树枝边
  2. 与“正常”边反过来走的是 后向边
  3. 把“同一层”的节点连起来的是 横叉边
  4. 跨越了“几层”连起来的是 前向边

我们可知树枝边不一定产生强连通,前向边对强连通没有任何作用(可以直接通过树枝边到达),我们只用考虑后向边和横叉边会不会产生强连通就行了

这里用 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值