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。

posted @ 2026-08-27 20:04  嘎嘎喵  阅读(19)  评论(0)    收藏  举报