【洛谷】P3387 【模板】缩点(Kosaraju 算法)

【洛谷】P3387 【模板】缩点(Kosaraju 算法)


洛谷专栏:模板,图论
洛谷模板:P3387 缩点
算法竞赛:图论,有向图的连通性问题
缩点算法:Kosaraju 算法
题目链接:洛谷 P3387

题目描述:
给定一个 n n n 个点 m m m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。
允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。


缩点(Contraction of Strongly Connected Components)

是图论中对有向图进行简化的重要操作,其核心是将图中的强连通分量(SCC)合并为单个节点。

强连通分量(Strongly Connected Component, SCC)

在有向图中,如果两个顶点 v v v u u u 之间有一条从 v v v u u u 的有向路径,同时也有一条从 u u u v v v 的有向路径,即两个顶点 v v v u u u 之间存在双向路径,则称这两个顶点强连通,这些强连通的顶点之间构成强连通分量。有向图的极大强连通子图称为强连通分量。

本题做法是将一张有向图的强连通分量缩成一个点,这个点的点权为原来环上点的点权之和。

强连通分量和有向图相关基础知识可见 OI-WiKi

缩点大致过程如下图。

缩点步骤

  1. 使用动态数组正反存图。
  2. 正向 dfs 遍历图并存到存点数组里(图不一定联通;dfs 递归得到的数组顺序是从后往前)
  3. 倒序 dfs 遍历存点数组,$ccnum $ 计组数(单点算一组,一个环算一组), c i = c c n u m c_i = ccnum ci=ccnum 表示编号为 i i i 的点属于 $ccnum $ 组, w c c n u m = w c c n u m + v a l i w_{ccnum} = w_{ccnum} + val_i wccnum=wccnum+vali 将每组中的点求和,其中 v a l i val_i vali 表示点 i i i 的点权, w c c n u m w_{ccnum} wccnum 表示 c c n u m ccnum ccnum 组的组权。
  4. 创建新图:循环遍历每个点的边,如果 c i ≠ c j c_i \ne c_j ci=cj 就存下这条点 j j j 到点 i i i 的有向边,其中 i , j i,j i,j 为原图一条从点 j j j 到点 i i i 的有向边的两个顶点, c i , c j c_i,c_j c
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HAH-HAH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值