1 条题解
-
0
自动搬运
来自洛谷,原作者为

ix35
垒球搬运于
2025-08-24 22:32:33,当前版本为作者最后更新于2022-08-18 23:14:42,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
前言
本题是洛谷 2021 年 7 月月赛的 F 题,出题人是 zjc,验题人是我。
当时由于我的月赛已经有了五题,然后碰巧 zjc 又投了一题,就正好凑了一场月赛。本题难度很高,场上最高分和次高分分别是 jiangly 的 86 分和铃的 53 分。
在比赛结束后的一年之内都没有人 AC 这道题目,直到上个月,我在好题分享时分享了此题,才有一位实力非常强劲的同学通过本题。于是我想公开一下此题的题解,以期让更多人做到这道好题。
Part 0:题意
题目大意:有 个点,给定 个点对,现在需要构造一张 条边的无向图,使得 个点对之间的最短路之和最小。求最小值和取到最小值的连边方案数。
Part 1:第一问
本题的一个首要的观察是要知道第一问的答案。
引理 1. 设 个点对构成的无向图为 ,求 中的最小环长度 ,则第一问的答案为 。
同时我们可以得到关于连边方案的推论:
推论 1. 一个连边方案是合法的(即可以最小化最短路之和),当且仅当存在一个 的最小圈,使得 的不在最小环上的边都连了,而且该最小圈上的 个点之间连了一棵树,使得环上相邻点的最短路之和恰好为 。
由于证明和题目做法没有太大关联,所以请参考出题人的回答:https://www.zhihu.com/question/469848445/answer/1998538740 。
最小圈的长度是很容易计算的,接下来我们探讨的就是如何求第二问的答案。
Part 2:环
当 本身是环时,最小环长度就是 ,根据推论 1,我们只需要计算:有多少种 个点的树 ,使得 。
我们将树看作以 为根的,那么有结论:
引理 2. 树 符合条件,当且仅当以每个点 为根的子树中,点的标号构成一个连续区间。
证明:考虑 这个距离之和,一定是每条边在 这个过程中恰好经过两次,所以一个点子树内和子树外分别是环上一段连续区间,由于 在子树外( 的情况是平凡的),所以子树内就必然是一段区间了。上述过程同时证明了充分性和必要性。
考虑如何计数,设 的编号最小的儿子为 , 子树内点的标号为 。
那么 中的点也构成了一棵符合引理 2 条件的树。再考虑以 为根的子树,由于 并不是标号最大的点,所以不能直接递归,但我们可以拆分为 和 两部分,不难发现这两部分也都是符合引理 2 条件的树(其中对于后者, 是编号最小的点,和编号最大显然是等价的),所以我们可以将 唯一分解成 三段,每段都是一个子问题。
于是设 表示答案,就有 。
Part 2.5:仙人掌
仙人掌的每个环可以看作是独立的,因此假设有 个最小环,算出最小环对应的答案 后乘上 即可。
Part 3:杏仁
杏仁指的是这样的图:由两个点 和它们之间的 条不交路径组成,设这些路径的长度分别为 。
我认为设计杏仁的部分分是这题设计上很精彩的一处。对正解有不错的启发作用。
最小环长度一定是 ,最小环个数也并不难算,但现在我们面临的问题是:不能直接把最小环个数和 相乘直接得到答案,因为可能算重。
例如 和 是两个不同的最小环,但是如果一种连边方案包含了 中的所有边,只改变了 中点之间的连边,那么就会被在两个环里各算一次,产生重复。
为此我们需要容斥。设 表示在两条长度分别为 的首尾相接的路径 (构成一个长度 的环)上构造满足引理 2 的树,并且 中除了起点终点外的点连边均不变(也就是保留 中所有边,且 独有的点之间没有边)的方案数。
对于上面算重的问题,我们只需减掉 对应的这些情况即可得到正确答案。
如何计算 呢?我们有如下结论:
引理 3. 一个树符合 的要求,当且仅当它符合引理 2 的要求,并且排除 中的边后, 中的点形成的两个连通块分别是 的一段前缀和一段后缀。
证明:根据引理 2 的证明我们知道,删除一条边后树的每个连通块都是环上连续段,于是我们删去 中任意一条边,构成的两个连通块都是环上连续段,那么一定分别包含 的一段前缀和后缀。
所以我们枚举前缀的长度就可以了,即 ,和 无关。
Part 4:一般图
进行和杏仁类似的思考,对于一种连边方案 和一个最小环 ,我们称 服从 当且仅当:
- 对于 的任意不属于 的顶点集导出子图的边,它都在 中出现。
也就是我们可以把一种方案 关联到若干个最小环,这些最小环可以作为推论 1 中所说的 对应到的最小环。
我们的想法依旧是分成 服从的最小环唯一和不唯一这两种情况来讨论:
-
Case 1: 服从的最小环不唯一。
设 服从最小环 ,那么 只能改动 的在 交集中的边,我们设它们的交集是 。一个结论是: 必然是一条长度不超过 的路径(读者自证)。
更进一步地,我们可以找到路径 上的一个区间 ,使得 的第一条边和最后一条边都不属于 (只需把 的属于 的前后缀剥掉即可),这样的 是由 唯一确定的。
我们枚举 ,设其长度为 ,我们只能改动这条路径上的边,于是我们回想起上一部分中的结论,答案几乎就是 ,但是我们还需要注意这里加了一个 的两端都不属于 的限制,因此我们容斥一下,就是 。
-
Case 2: 服从的最小环唯一。
其实我们仔细推敲一下就会发现,上一部分并不是只算了 服从的最小环不唯一的情况,毕竟我们只是要求 只改动了 上一段长度不超过 的路径上的边这个条件。所以这里我们实际上要统计的是不满足这一条件的 数量。
有了上一段的基础,这里就比较简单了,对于一个最小环 ,我们要求 不能包含任何长度不小于一半的区间,由于我们已经会算反面,所以利用上文的 做个容斥即可,式子比较类似于二项式反演,这里从略。
Part 5:步骤总结
Step 1:首先求出任意两点间最短路 ,第一条边和最短路不同的最短路 ,最短路的数量 ,同时求出最小环长 和最小环个数 (最小环一定是由 构成,所以可以方便地统计数量)。这可以对每个起点 BFS 做到 。
Step 2:计算 和 。观察递推式 ,利用辅助数组 就可以做到 ,当然也可以求出封闭形式后 解决,但没有必要;而 直接算就是 的。
Step 3:枚举 并统计 Case 1 的答案。我们只需枚举 的端点 即可,要求 ,这种情况每个 的答案都是 ,枚举的时间复杂度为 。
Step 4:统计 Case 2 的答案。进行容斥后将单个最小环的答案乘上 即可,时间复杂度为 。
于是最终时间复杂度为 。
- 1
信息
- ID
- 7038
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者