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