1 条题解

  • 0
    @ 2025-8-24 22:32:33

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ix35
    垒球

    搬运于2025-08-24 22:32:33,当前版本为作者最后更新于2022-08-18 23:14:42,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    前言

    本题是洛谷 2021 年 7 月月赛的 F 题,出题人是 zjc,验题人是我。

    当时由于我的月赛已经有了五题,然后碰巧 zjc 又投了一题,就正好凑了一场月赛。本题难度很高,场上最高分和次高分分别是 jiangly 的 86 分和铃的 53 分。

    在比赛结束后的一年之内都没有人 AC 这道题目,直到上个月,我在好题分享时分享了此题,才有一位实力非常强劲的同学通过本题。于是我想公开一下此题的题解,以期让更多人做到这道好题。


    Part 0:题意

    题目大意:有 nn 个点,给定 mm 个点对,现在需要构造一张 m1m-1 条边的无向图,使得 mm 个点对之间的最短路之和最小。求最小值和取到最小值的连边方案数。

    n2000, n×m2×107n\leq 2000,\ n\times m\leq 2\times 10^7


    Part 1:第一问

    本题的一个首要的观察是要知道第一问的答案。

    引理 1.mm 个点对构成的无向图为 GG,求 GG 中的最小环长度 ll,则第一问的答案为 m+l2m+l-2

    同时我们可以得到关于连边方案的推论:

    推论 1. 一个连边方案是合法的(即可以最小化最短路之和),当且仅当存在一个 GG 的最小圈,使得 GG 的不在最小环上的边都连了,而且该最小圈上的 ll 个点之间连了一棵树,使得环上相邻点的最短路之和恰好为 2l22l-2

    由于证明和题目做法没有太大关联,所以请参考出题人的回答:https://www.zhihu.com/question/469848445/answer/1998538740

    最小圈的长度是很容易计算的,接下来我们探讨的就是如何求第二问的答案。


    Part 2:环

    GG 本身是环时,最小环长度就是 nn,根据推论 1,我们只需要计算:有多少种 nn 个点的树 TT,使得 dis(1,2)+dis(2,3)++dis(n1,n)+dis(n,1)=2n2dis(1,2)+dis(2,3)+\ldots+dis(n-1,n)+dis(n,1)=2n-2

    我们将树看作以 nn 为根的,那么有结论:

    引理 2.TT 符合条件,当且仅当以每个点 ii 为根的子树中,点的标号构成一个连续区间。

    证明:考虑 2n22n-2 这个距离之和,一定是每条边在 12n11\to 2\to\ldots n\to 1 这个过程中恰好经过两次,所以一个点子树内和子树外分别是环上一段连续区间,由于 nn 在子树外(i=ni=n 的情况是平凡的),所以子树内就必然是一段区间了。上述过程同时证明了充分性和必要性。

    考虑如何计数,设 nn 的编号最小的儿子为 b1b_1b1b_1 子树内点的标号为 [1,c1][1,c_1]

    那么 [c1+1,n][c_1+1,n] 中的点也构成了一棵符合引理 2 条件的树。再考虑以 b1b_1 为根的子树,由于 b1b_1 并不是标号最大的点,所以不能直接递归,但我们可以拆分为 [1,b1][1,b_1][b1,c1][b_1,c_1] 两部分,不难发现这两部分也都是符合引理 2 条件的树(其中对于后者,b1b_1 是编号最小的点,和编号最大显然是等价的),所以我们可以将 [1,n][1,n] 唯一分解成 [1,b1],[b1,c1],[c1+1,n][1,b_1],[b_1,c_1],[c_1+1,n] 三段,每段都是一个子问题。

    于是设 fnf_n 表示答案,就有 fn=a+b+c=n+1fafbfcf_n=\sum_{a+b+c=n+1}f_af_bf_c


    Part 2.5:仙人掌

    仙人掌的每个环可以看作是独立的,因此假设有 cc 个最小环,算出最小环对应的答案 flf_l 后乘上 cc 即可。


    Part 3:杏仁

    杏仁指的是这样的图:由两个点 s,ts,t 和它们之间的 kk 条不交路径组成,设这些路径的长度分别为 L1LkL_1\leq \ldots\leq L_k

    我认为设计杏仁的部分分是这题设计上很精彩的一处。对正解有不错的启发作用。

    最小环长度一定是 L1+L2L_1+L_2,最小环个数也并不难算,但现在我们面临的问题是:不能直接把最小环个数和 flf_l 相乘直接得到答案,因为可能算重。

    例如 L1+L2L_1+L_2L1+L3L_1+L_3 是两个不同的最小环,但是如果一种连边方案包含了 L2,L3,,LkL_2,L_3,\ldots,L_k 中的所有边,只改变了 L1L_1 中点之间的连边,那么就会被在两个环里各算一次,产生重复。

    为此我们需要容斥。设 h(a,b)h(a,b) 表示在两条长度分别为 a,ba,b 的首尾相接的路径 A,BA,B(构成一个长度 a+ba+b 的环)上构造满足引理 2 的树,并且 BB 中除了起点终点外的点连边均不变(也就是保留 BB 中所有边,且 A,BA,B 独有的点之间没有边)的方案数。

    对于上面算重的问题,我们只需减掉 h(L1,L2)h(L_1,L_2) 对应的这些情况即可得到正确答案。

    如何计算 h(a,b)h(a,b) 呢?我们有如下结论:

    引理 3. 一个树符合 h(a,b)h(a,b) 的要求,当且仅当它符合引理 2 的要求,并且排除 BB 中的边后,AA 中的点形成的两个连通块分别是 AA 的一段前缀和一段后缀。

    证明:根据引理 2 的证明我们知道,删除一条边后树的每个连通块都是环上连续段,于是我们删去 BB 中任意一条边,构成的两个连通块都是环上连续段,那么一定分别包含 AA 的一段前缀和后缀。

    所以我们枚举前缀的长度就可以了,即 h(a,b)=h(a)=c+d=a+1fcfdh(a,b)=h(a)=\sum_{c+d=a+1}f_cf_d,和 bb 无关。


    Part 4:一般图

    进行和杏仁类似的思考,对于一种连边方案 G0G_0 和一个最小环 CC,我们称 G0G_0 服从 CC 当且仅当:

    • 对于 GG 的任意不属于 CC 的顶点集导出子图的边,它都在 G0G_0 中出现。

    也就是我们可以把一种方案 G0G_0 关联到若干个最小环,这些最小环可以作为推论 1 中所说的 G0G_0 对应到的最小环。

    我们的想法依旧是分成 G0G_0 服从的最小环唯一和不唯一这两种情况来讨论:

    • Case 1:G0G_0 服从的最小环不唯一。

      G0G_0 服从最小环 C1,,CkC_1,\ldots,C_k,那么 G0G_0 只能改动 GG 的在 C1,,CkC_1,\ldots,C_k 交集中的边,我们设它们的交集是 DD。一个结论是:DD 必然是一条长度不超过 l2\frac{l}{2} 的路径(读者自证)。

      更进一步地,我们可以找到路径 DD 上的一个区间 PP,使得 PP 的第一条边和最后一条边都不属于 G0G_0(只需把 DD 的属于 G0G_0 的前后缀剥掉即可),这样的 PP 是由 G0G_0 唯一确定的。

      我们枚举 PP,设其长度为 pp,我们只能改动这条路径上的边,于是我们回想起上一部分中的结论,答案几乎就是 h(p)=a+b=p+1fafbh(p)=\sum_{a+b=p+1}f_af_b,但是我们还需要注意这里加了一个 PP 的两端都不属于 G0G_0 的限制,因此我们容斥一下,就是 h(p)+h(p2)2×h(p1)h(p)+h(p-2)-2\times h(p-1)

    • Case 2:G0G_0 服从的最小环唯一。

      其实我们仔细推敲一下就会发现,上一部分并不是只算了 G0G_0 服从的最小环不唯一的情况,毕竟我们只是要求 G0G_0 只改动了 GG 上一段长度不超过 l2\frac{l}{2} 的路径上的边这个条件。所以这里我们实际上要统计的是不满足这一条件的 G0G_0 数量。

      有了上一段的基础,这里就比较简单了,对于一个最小环 CC,我们要求 G0G_0 不能包含任何长度不小于一半的区间,由于我们已经会算反面,所以利用上文的 h(p)h(p) 做个容斥即可,式子比较类似于二项式反演,这里从略。


    Part 5:步骤总结

    Step 1:首先求出任意两点间最短路 disi,jdis_{i,j},第一条边和最短路不同的最短路 sei,jse_{i,j},最短路的数量 cnti,jcnt_{i,j},同时求出最小环长 ll 和最小环个数 cc(最小环一定是由 disi,j+sei,jdis_{i,j}+se_{i,j} 构成,所以可以方便地统计数量)。这可以对每个起点 BFS 做到 O(nm)O(nm)

    Step 2:计算 fnf_nh(n)h(n)。观察递推式 fn=a+b+c=n+1fafbfcf_n=\sum_{a+b+c=n+1}f_af_bf_c,利用辅助数组 gn=a+b=nfafbg_n=\sum_{a+b=n}f_af_b 就可以做到 O(n2)O(n^2),当然也可以求出封闭形式后 O(n)O(n) 解决,但没有必要;而 h(n)h(n) 直接算就是 O(n2)O(n^2) 的。

    Step 3:枚举 PP 并统计 Case 1 的答案。我们只需枚举 PP 的端点 s,ts,t 即可,要求 diss,tl2dis_{s,t}\leq \frac{l}{2},这种情况每个 PP 的答案都是 h(dis)+h(dis2)2×h(dis1)h(dis)+h(dis-2)-2\times h(dis-1),枚举的时间复杂度为 O(n2)O(n^2)

    Step 4:统计 Case 2 的答案。进行容斥后将单个最小环的答案乘上 cc 即可,时间复杂度为 O(n2)O(n^2)

    于是最终时间复杂度为 O(n(n+m))O(n(n+m))

    • 1

    信息

    ID
    7038
    时间
    2000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者