此题解部分借鉴于九野的博客

题目分析

  • 给定一个 \(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)的更多相关文章

  1. Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊

    [洛谷P2783] 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. ...

  2. 【模板】缩点(Tarjan算法)/洛谷P3387

    题目链接 https://www.luogu.com.cn/problem/P3387 题目大意 给定一个 \(n\) 个点 \(m\) 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之 ...

  3. 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

    洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...

  4. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

  5. tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows

    缩点练习 洛谷 P3387 [模板]缩点 缩点 解题思路: 都说是模板了...先缩点把有环图转换成DAG 然后拓扑排序即可 #include <bits/stdc++.h> using n ...

  6. 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)

    题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...

  7. 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)

    传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...

  8. 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路

    题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...

  9. 【洛谷P5008 逛庭院】tarjan缩点+贪心

    既然没有题解,那么我就来提供给一份. -- 首先我们看到数据范围.妈耶!数据这么大,一开始还想用个DP来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪 ...

随机推荐

  1. Redis的分布式和主备配置调研

    目前Redis实现集群的方法主要是采用一致性哈稀分片(Shard),将不同的key分配到不同的redis server上,达到横向扩展的目的. 对于一致性哈稀分片的算法,Jedis-2.0.0已经提供 ...

  2. Git原理入门简析

    为了获得更好的阅读体验,建议访问原地址:传送门 前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的 ...

  3. SQLServer数据库处于恢复挂起状态的解决办法

    一.总结 如果数据库处于一个恢复挂起的状态,并且对数据库做脱机和分离的操作,报出数据库文件不可访问的错误,可能是因为数据库的数据文件和日志文件在数据库正常连接的情况下,文件所在的磁盘脱机了,导致数据库 ...

  4. 欢迎加入我的知识星球:C语言解惑课堂

    我在知识星球上开通了一个有关C语言基础答疑解惑的星球,它叫做:“C语言解惑课堂”.看这名字你就知道虽然有点俗,俗才贴近你的真正需求嘛!这是一个专门帮助C语言初学者答疑解惑的课堂.嗯~~~,关于这个星球 ...

  5. AutoResetEvent控制线程用法

    本文主要来自一道面试题,由于之前对AutoResetEvent的用户很模糊(即使已经使用过了).面试题题目很简洁:两个线程交替打印0~100的奇偶数.你可以先动手试试,我主要是尝试在一个方法里面完成这 ...

  6. 线程的start方法解析

    Thread是学习我们学习多线程接触到的第一个有关多线程的类,相信每一个学习过或者了解过Java多线程的小伙伴都知道Thread类.这次分享主要对Thread的start方法进行讲解. 相信大家都知道 ...

  7. .NET Core 单元测试

    应用程序测试的类型很多,包括集成测试,Web 测试,负载测试等.在最底层的是单元测试,此测试可以测试单个软件组件或方法.单元测试一般只测试开发人员的代码,不应该测试基础结构普.问题,如数据库,文件系统 ...

  8. iNeuOS 物联网云操作系统2.0发布,集成设备容器、视图建模、机器学习三大模块

    目       录 1.      概述... 2 2.      使命及目标... 3 3.      系统框架... 4 4.      设备容器(iNeuKernel)... 4 5.      ...

  9. .Net Core 三大Redis客户端对比和使用心得

    前言 稍微复杂一点的互联网项目,技术选型都可能会涉及Redis,.NetCore的生态越发完善,支持.NetCore的Redis客户端越来越多, 下面三款常见的Redis客户端,相信大家平时或多或少用 ...

  10. HDU 1079

    题意略. 思路:dfs记忆化搜索即可. #include<bits/stdc++.h> using namespace std; ][][]; ][]; bool is_leap(int ...