作者:钟知闲
关键字:图论 数学 概率与期望
题目简述
以网格图的形式给出一个无根树,以及树的点集的一个子集
C
。现从
树的节点数不超过
50×50
,
|C|≤300
,
2≤K≤|C|
。
题解
在解决问题之前首先要明确
length
如何计算,即对于给定的点集
S
,经过
由于本题给出的网格图是一个树,所以可以利用树的性质来解决问题。例如,树上任意两点
u,v
间简单路径唯一,且该路径为
u,v
间最短路径;树的每一条边都是割边,删除后导致
u,v
不连通当且仅当该边在
u
到
类比树上任意两点之间连通,可以得到一个基本的性质:
性质1 对于任意
S⊆C
和
a,b∈S
,存在一条从
a
出发经过
证明 设
设
性质2
P
以
证明 假如
P
不以
类似地,如果
性质3
∀i∈[1,|S|)
,
P
中第一次经过
证明 如果
P
中从第一次经过
性质4 边
e∈P
当且仅当删除
e
后
证明 设删除
如果删除
e
后任意
性质5 任意边
e
在
证明 假设
性质6 边
证明 若
反过来,若边
根据以上性质,可以得到,对于点集
S
,若经过
length(P)=2|ES−path(u,v)|+|path(u,v)|\=2|ES|−|path(u,v)|
length(P)=2|ES−path(u,v)|+|path(u,v)|\=2|ES|−|path(u,v)|
其中,
显然要使
length(P)
最短,就要选择
u,v
使得
|path(u,v)|
最大,即
u,v
是
S
中的最远点对。设
从而,设
length=2|ES|−DS
length=2|ES|−DS
现在我们考虑如何求 (???)(???) 的期望值,即
E(length)
。由期望值的性质不难得出
E(length)=2E(|ES|)−E(DS)
E(length)=2E(|ES|)−E(DS)
因此只需分开计算
|ES|
和
DS
的期望值。
首先考虑如何计算
|ES|
。用
E
表示树的边集,显然
对于
e∈E
,
e∉ES
当且仅当删去
e
之后,
因此 P(e∈ES)=1−(sK)(|C|K)−(|C|−sK)(|C|K)P(e∈ES)=1−(sK)(|C|K)−(|C|−sK)(|C|K)
注意组合数的值可能很大,因此程序中直接计算可能溢出,超过浮点数的范围。记
f(a,b,K)=(aK)(a+bK)
,化简可得 f(a,b,K)=a!K!(a−K)!(a+b)!K!(a+b−K)!=a!(a−K)!⋅(a+b−K)!(a+b)!=a(a−1)…(a−K+1)(a+b)(a+b−1)…(a+b−K+1)f(a,b,K)=a!K!(a−K)!(a+b)!K!(a+b−K)!=a!(a−K)!⋅(a+b−K)!(a+b)!=a(a−1)…(a−K+1)(a+b)(a+b−1)…(a+b−K+1)
计算
f(a,b,K)
的方法如下:
f(a, b, K):
x = 1
for i = 0 to K - 1:
x = x * (a - i) / (a + b - i)
return x
这样,根据期望的性质就能得出 E(|ES|)=∑e∈EP(e∈ES)=∑e∈E(1−f(se,|C|−se,K)−f(|C|−se,se,K))E(|ES|)=∑e∈EP(e∈ES)=∑e∈E(1−f(se,|C|−se,K)−f(|C|−se,se,K))
其中
se
为删去
e
之后其中一个连通块中属于
若 e=(u,v) ,则 u,v 必有一个是另一个的父节点,不妨设 u 是
这样就能在 O(|V|) 的时间内求出所有的 se ,进而在 O(|E|K)=O(|V|K) 的时间内求出 E(|ES|) ,其中 V 为树的点集,
接着再考虑如何计算 E(DS) 。因为 C 中的点对只有
这里 h(v) 是对每个点 v 分配的编号,要求所有点的
现在考虑计算 a,b 是 S 的最远点对(所有
∀v∈S−a,b,maxd(v,a),d(v,b)