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

- 把可以互相抵达的点集叫做一个连通分量
- 最大的那个可以互相抵达的点点集即为强连通分量
- 特别的,单个的点也可以是强连通分量
比如说 :\(\{ 4, 5 \}\) 是一个联通分量,而 ${4,5,6 } $ 则是一个强连通分量(一个大点)
tarjan的过程就是通过 dfs 找强连通分量(大点)的过程
对图dfs一下,遍历所有未遍历过的点 ,会得到一个有向树,显然有向树是没有环的。(注意搜过的点不会再搜
则能产生环的 只有(指向已经遍历过的点)的边
我们发现 \(7 \to 3\) (红边 / 横叉边)这种边一定不会产生连通分量
而 \(6 \to 4\) (绿边 / 返祖边)这种边一定会产生联通分量
具体来说:具有父子关系的边一定会产生联通分量
我们在dfs的时候需要用一个栈来保存当前所在路径上的点(栈中所有点一定是有父子关系的)
我们用一些数组来表示dfs的过程
int tim, dfn[MAX], low[MAX]
\(dfn[i]\) 表示遍历到节点 \(i\) 的时间戳(第几次遍历)
\(low[i]\) 表示往上可以到达最早的点
初始化 \(dfn[i] = low[i] = ++tim\)
我们可以根据上面过程的步骤写出以下代码
for(int i = head[u]; i; i = nex[i]) {
if(dfn[to[i]]) {
if(instack[to[i]]) {
if(low[to[i]] < low[u]) {
low[u] = low[to[i]];
}
}
} else {
dfs(to[i]);
if(low[to[i]] < low[u]) {
low[u] = low[to[i]];
}
}
}
假如当前节点 \(u\), \(dfn[u] == low[u]\) 那就说明栈顶元素一直到节点 \(u\) 都属于一个强联通分量,感性理解
把栈中元素弹出并且把他们都给标记为同一种颜色(同一个强连通分量)
if(dfn[u] == low[u]) {
++totcol;
do {
int v = stk[top];
col[v] = totcol;
instack[v] = false;
} while(stk[top--] != u);
}
具体实现看代码
\(\color {Deepskyblue} {Code}\)
这里还有一道 tarjan练手好题
tarjan缩点(洛谷P387)的更多相关文章
- Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊
[洛谷P2783] 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. ...
- 【模板】缩点(Tarjan算法)/洛谷P3387
题目链接 https://www.luogu.com.cn/problem/P3387 题目大意 给定一个 \(n\) 个点 \(m\) 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之 ...
- 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...
- NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...
- tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows
缩点练习 洛谷 P3387 [模板]缩点 缩点 解题思路: 都说是模板了...先缩点把有环图转换成DAG 然后拓扑排序即可 #include <bits/stdc++.h> using n ...
- 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)
题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...
- 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...
- 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路
题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...
- 【洛谷P5008 逛庭院】tarjan缩点+贪心
既然没有题解,那么我就来提供给一份. -- 首先我们看到数据范围.妈耶!数据这么大,一开始还想用个DP来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪 ...
随机推荐
- 2、JAVA相关基础的学习和工具
个人感觉,各种语言的基础知识,例如标识符,运算符等在宏观上几乎是一样的,只是在某些方面上会有一点点差异,因为本人已经有了语言基础,所以对于标识符,关键字,运算符等方面的只是便不作赘述,敬请谅解,如果你 ...
- JAVA基础知识(六)Java 静态多分派&动态单分派
1.分派发生在编译期和运行期,编译期的分派为静态分派,运行期的为动态分派. 2.编译期是根据对象声明的类型来选择方法,运行期是根据对象实际类型来选择方法. 3.单分派和多分派取决于宗量, 方法调用者和 ...
- JavaScript 数组、字符串、Map、Set 方法整理
在线阅读 https://www.kancloud.cn/chenmk/web-knowledges/1080519 数组 isArray():Array.isArray(value) 用于检测变量是 ...
- 学习Canvas这一篇文章就够了
一.canvas简介 <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是 ...
- Java 在spring cloud中使用Redis,spring boot同样适用
1.本地安装redis服务,官网下载. 2.在开发中要使用redis,首先要启动本地redis服务,启动后页面如下: 3.在spring boot项目pom.xml文件中添加Redis需要的依赖包,可 ...
- 重学计算机组成原理(十)- "烫烫烫"乱码的由来
程序 = 算法 + 数据结构 对应到计算机的组成原理(硬件层面) 算法 --- 各种计算机指令 数据结构 --- 二进制数据 计算机用0/1组成的二进制,来表示所有信息 程序指令用到的机器码,是使用二 ...
- JavaScript的垃圾回收机制与内存泄漏
常用的两种算法: 引用计数(新版浏览器已弃用,弃用原因:会出现循环引用的情况,无法进行垃圾回收,导致内存泄漏) 标记清除 引用计数法 引用计数,顾名思义一个对象是否有指向它的引用,即看栈中是否有指向要 ...
- ts 学习笔记 - 泛型
目录 泛型 举个栗子 泛型约束 多个参数时也可以在泛型约束中使用类型参数 泛型接口 泛型类 泛型参数的默认类型 泛型 泛型(Generics)是指在定义函数.接口或者类的时候, 不预先指定其类型,而是 ...
- ConcurrentLinkedQueue 源码解读
一.介绍 ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部:当我们获取一个元素时,它 ...
- [Python] Django框架入门2——深入模型
说明: 本文主要深入了解模型(models.py),涉及ORM简介.模型定义.模型成员.模型查询.自连接等.需要一定基础,可以先走一走基本入门流程. 附录一使用mysql数据库,附录二Django开发 ...