题目大意
%
给定一幅无向图,求其严格次小生成树。
数据范围 点数非负且不超过十的五次方,边数非负且不超过三乘十的五次方,边权非负且不超过十的九次方。
题解
% 首先是一条定理:
定理1 对于任意形态的最小生成树,至少存在一种形态的次小生成树1与最小生成树相差不超过一条边。即对于任意形态的最小生成树,仅需要替换不超过一条边即可变成次小生成树。
证1 如果次小生成树与最小生成树相差两条边,设边 a a a 替换了最小生成树中的边 u u u,边 b b b 替换了最小生成树中的边 v v v,则替换后生成树的边权和与替换前生成树的边权和的差距为 ( a − u + b − v ) (a-u+b-v) (a−u+b−v),有四种情况:
- l e n a < l e n u , l e n b < l e n v len_a<len_u,len_b<len_v lena<lenu,lenb<lenv:此时 a − u + b − v < a + b a-u+b-v<a+b a−u+b−v<a+b,与最小生成树的定义矛盾。
- l e n a > l e n u , l e n b > l e n v len_a> len_u,len_b> len_v lena>lenu,lenb>lenv:此时如果只用 b b b 换 v v v,次小生成树会更小,不符合次小生成树的定义。
- l e n a > l e n u , l e n b = l e n u len_a>len_u,len_b=len_u lena>lenu,lenb=lenu:此时如果只用 a a a 换 u u u,则会得到与最小生成树相等的次小生成树,相比较两条边都替换,显然指后者得到的生成树会更小与次小生成树定义矛盾。
- l e n a = l e n u , l e n u = l e n v len_a=len_u,len_u=len_v lena=lenu,lenu=lenv:显然只需要换其中一条边,即可达成与最小生成树相等的次小生成树。
% 证毕。
% 下面开始考虑严格次小生成树,可以发现,能构成非严格次小生成树(也就是和最小生成树边权和相等的树)的情况只有上述证明中的第 3 种和第 4 种情况。可以发现,在这些情况下都存在某条边的权值等于代替换边的权值。因而我们可以得到:
定理2 对于任意形态的最小生成树,至少存在一种形态的严格次小生成树与最小生成树相差不超过一条替换前后权值不相等的边。即对于任意形态的最小生成树,至多只需要删除一条边,并加上一条权值不等于删去的边的权值的边即可变成严格次小生成树。
证2 假设最小生成树变成严格次小生成树需要替换两条替换前后权值不相等边,设边
a
a
a 替换了最小生成树中的边
u
u
u,边
b
b
b 替换了最小生成树中的边
v
v
v,则替换后生成树的边权和与替换前生成树的边权和的差距为
(
a
−
u
+
b
−
v
)
(a-u+b-v)
(a−u+b−v),有两种情况:
- l e n a < l e n u , l e n b < l e n v len_a<len_u,len_b<len_v lena<lenu,lenb<lenv:此时 a − u + b − v < a + b a-u+b-v<a+b a−u+b−v<a+b,与严格最小生成树的定义矛盾。
- l e n a > l e n u , l e n b > l e n v len_a> len_u,len_b> len_v lena>lenu,lenb>lenv:此时如果只用 b b b 换 v v v,严格次小生成树会更小,不符合严格次小生成树的定义。2
% 综上,我们得到了一个全新的算法。
- 先求出最小生成树。(Prime/KrusKal)
- 枚举不在最小生成树中的边,尝试加入最小生成树中。
- 加入生成树后,必然形成一个环,在环上找一条长度严格小于加入的边长度的最长的边,尝试断开它,记录答案,恢复最小生成树。
- 在所有答案中,取最大的答案。
% 其中,求环长度严格次小的边可以用LCT或者倍增实现。因而总时间复杂度为 Θ ( ( n + m ) log 2 n ) \Theta((n+m)\log_2n) Θ((n+m)log2n)