一.定义:将所有生成树按照权值之和从小到大排列,求排在第二位的生成树.(PS:分严格与不严格, 如果最小生成树不唯一,严格次小生成树的权值必选小于最小生成树的权值)
二.生成树相关性质(参考蓝书)
1.切割性质:(各边边权均不相同)一条边是连接某两个集合的最小边,那么这条边就在最小生成树中
2.回路性质:(各边边权均不相同)图若有回路,那么回路中的最长边一定不在最小生成树中
三.预备知识—求树上两点的间的最大边权
1. 树型DP
1)最小瓶颈路:(u到v的路径满足最大边权值尽量小
→
→
kruskal),先求最小生成树,然后u到v的路径在树上是唯一的,取路径中最长的一条。
2)算法:树型DP
→
→
f[u,v]:节点u,v之间的最小瓶颈路的最大边长
3)步骤:
建立最小生成树
dfs遍历:
令当前访问的节点为now,父亲节点为fa,已经访问过的点x,w[i,j]为权值
转移方程:
f[x,now]=ma(f[x,fa],w[now,fa])
f
[
x
,
n
o
w
]
=
m
a
(
f
[
x
,
f
a
]
,
w
[
n
o
w
,
f
a
]
)
4)时间复杂度:O(
n2
n
2
) [ 枚举:n 遍历;n ]
2.
LCA
L
C
A
对于单个询问,直接求出两点间的
LCA
L
C
A
,再直接暴力地找就行了
PS
P
S
:可以利用
LCA
L
C
A
与
RMQ
R
M
Q
的转化优化,最快可以做到
O(n)
O
(
n
)
预处理,
O(1)
O
(
1
)
的查询 {
LCA→±RMQ
L
C
A
→
±
R
M
Q
(约束
RMQ
R
M
Q
) }
3.
kruskal
k
r
u
s
k
a
l
重构树
具体的网上有,对此就不多说了.树上两点间
LCA
L
C
A
的点权即为所求.
blog
4.
…INF
…
I
N
F
像树剖、
LCT
L
C
T
那些神(du)奇(liu)的东西就不用说了吧 (反正也不会)
三:次小生成树
1.定理:次小生成树一定由最小生成树经过”边交换”(加上一条边再删去一条边)得到.
2.思路:枚举加入的新边,形成回路后,删去权值最大的一条边(回路性质)
3.步骤:
预处理出任意两点的最小瓶颈路
枚举新边,更新ans
update(2018.8.27):若
MST
M
S
T
不唯一,且要求严格次小生成树,则要保证删除的边权
<
<
新边边权(即有必要时,要寻找路径上的次小边),本人做法:特判,在kurskal重构树上直接暴力找.
若有更优的算法,望dalao指点