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来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪 ...
随机推荐
- 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践
1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...
- 微信小程序商城系统怎样搭建?
微信是一种非常便捷的生活方式,微信小程序一直深受企业和商家的青睐,如美团.京东.拼多多.唯品会.小红书等知名公司都推出了自己的小程序.对于网上商城小程序的开发似乎是一件非常难的事情,用什么开发?如何开 ...
- java中安全的单例与不安全的单例
java中安全的单例与不安全的单例 1.内部静态类(安全的) public class Singleton { private static class SingletonHolder{ privat ...
- git使用WebHook实现自动构建
说明 我们使用git进行版本管理常常会遇到这样的一个需求,希望git push的时候服务器上代码的代码也能自动更新,这次我使用了coding进行示范 一.编写git pull 更新脚本 auth_pu ...
- IDEA部署 java Web项目 常见配置
前言 从eclipse上转到idea上,第一次使用idea部署web项目,真折磨人,写了一个 helloworld 5分钟,了解idea部署web项目5小时. 我使用的是idea 2019.1版本,其 ...
- K8S学习笔记之filebeat采集K8S微服务java堆栈多行日志
0x00 背景 K8S内运行Spring Cloud微服务,根据定制容器架构要求log文件不落地,log全部输出到std管道,由基于docker的filebeat去管道采集,然后发往Kafka或者ES ...
- LoRaWAN调试踩坑心得(一)
先说两句 在调试和移植的过程中 我们经常想用节点去抓上行包 或者去抓下行包 但在抓取的过程中发现,上行包抓取不到到,或是下行包抓取不到,或者是两个都抓取不到,觉得非常的诡异.明明接收频点.BW和SF都 ...
- Spring学习之旅(十)--MockMvc
在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...
- Linux shell脚本判断服务器网络是否可以上网
Linux shell脚本判断网络畅通 介绍 在编写shell脚本时,有的功能需要确保服务器网络是可以上网才可以往下执行,那么此时就需要有个函数来判断服务器网络状态 我们可以通过curl来访问 www ...
- qt学习笔记(1):qt点击运行没有反应。
因为公司的项目需要,今天开始重新学习已经忘干净了的QT, 说起qt之前在学校刚接触的时候就打心底里喜欢这个编辑器, 因为一直使用vs做项目,面对着黑洞洞的窗口总让人不舒服, 自从接触了qt感觉迎来了曙 ...