20260818 - 图的连通性 总结
前言
啥玩意啊不是,合着拖了半个月也得补啊,合着还得写总结啊??
兄弟们这对吗??
总之就是,我恨 Tarjan(?
学了 \(n\) 遍 Tarjan 没一遍真正学懂了的(?
Tarjan 好难啊啊啊啊啊。
补题的时候我其实是倒着补的,但为什么总结要正着写,好难猜呀()
这次不放代码了 qwq。
A - 缩点 / 强连通分量
板子,缩完点之后拓扑 dp 一下即可。
B - The Cow Prom S
找出所有强连通分量,并统计出点数 \(>1\) 的强连通分量的个数。
C - 上白泽慧音
常规 Tarjan,最后要判字典序,但是可以直接用 vector 自带的 < 作比较,不然太恶心了。(骗你的我也是才知道 vector 有这么个比较
D - 受欢迎的牛 G
遇事不决先缩点。
缩完点后就能决了,发现最终能当明星的奶牛一定都在一个强连通分量里,所以找出那个出度为 \(0\) 的并判断是否每个点都被遍历到了。
注意细节有点点多,出度为 \(0\) 的点如果有两个就炸了,有任何一个点没被遍历到也炸了。
后面才发现不需要这么麻烦的其实,因为 \(n\) 只有 \(10^4\),所以直接暴力 BFS 从每个点出发跑就行了(类似于洪水填充)。诶,那是不是连点都不需要缩了?(?
E - 抢掠计划
和 A 几乎一模一样对吧,也是拓扑。
不过这里注意到一件事情,我们在 Tarjan 找强连通分量的时候,不是会给每个强连通分量一个编号吗,这个编号倒着来其实就是拓扑序,所以也不需要拓扑排序了(容易绕晕、写错),直接倒着枚举这些缩点后的编号然后一个个转移即可。
注意结束点一定是酒吧,开始点一定是给定的 \(S\),所以 Tarjan 的时候只需要从 \(S\) 出发跑一趟就行了。
F - 最大半连通子图
强连通一定是半连通,那么先缩个点再说。
缩完点之后,摇几组小数据,加上惊鸭的注意力,我们就可以发现半连通一定是缩点后的一条链!!(细节惊鸭的注意力)
那么就可以拓扑了,维护当前最长链长度以及最长链数量,最后找出最大的输出即可。注意更新的时候,如果新链长度等于当前最长链长度,那么数量加上这一次新的;如果新链长度大于当前最长链长度,那么数量等于这一次新的。
G - 校园网 Network of Schools
Tarjan 找出所有强连通分量,然后缩点。
不过缩点之后不需要建图了,因为并不需要在新图上跑拓扑或者别的什么之类。我们统计出度为 \(0\) 的点的个数(记为 \(res_0\))以及入度为 \(0\) 的点的个数(记为 \(res_1\))。那么第一问的答案显然就是 \(res_1\)(给它们发最终一定能遍历全图),然后鸭鸭智慧发现第二问是 \(\max(res_0,res_1)\)。至于怎么证?我也不太知道,感性理解一下好了。(细节鸭鸭智慧)
注意特判只有一个连通块的情况,输出 1\n0\n。
H - 强连通图
和 G 几乎是双倍经验了(第二问)。
第一问可以在 Tarjan 找强联通分量的时候直接取 \(\max\) 算出来,很轻松;然后第二问和 G 是一样的,就不多说了。
I - 间谍网络
缩点之后把所有入度为 \(0\) 的的价格加起来就行了,这样一定是最优的覆盖所有的策略,很好证。如果有哪个点在缩点的时候没遍历到(注意 Tarjan 时不能从无法被收买的地方出发),那么就无解,然后输出编号。
J - We Need More Bosses
首先需要放怪物的一定是桥,那么把是桥的边的权值设为 \(1\),否则为 \(0\)。Tarjan 求一遍。
接下来问题就转化为找出一条权值最大的路径,哎,这个好办!我们用树的直径的类似做法扫两遍 DFS 就行了嘿。不是树没关系,打 \(vis\) 标记判断一下就好啦。
K - Substring
首先缩点,之后开始拓扑 dp,\(dp_{u,x}\) 表示当前节点 \(u\) 处时最多能有多少个 \(x\) 字母(令 \(\text{a}\sim\text{z}\) 为 \(0 \sim 25\)),依次处理一下就行。
最后找 \(\max\) 输出即可。
总结
遇事不决先选 C 是对的,遇事不决先缩点也是对的。
Tarjan 是个好东西,可惜我用不好,唉唉。
感觉这次的题目也没有大家说的那么一坨吧 OvO。

浙公网安备 33010602011771号