TopCoder SRM 561 Orienteering 题解

作者:钟知闲
关键字:图论 数学 概率与期望
题目简述

以网格图的形式给出一个无根树,以及树的点集的一个子集 C 。现从 C 的所有大小为 K 的子集中等概率选取一个子集 S,记 length 为树中经过所有 S 中的点的最短路径长度(路径长度定义为经过的边数,可以重复经过同一条边,此时长度需要被计算多次)。给定无根树、点集 C 以及整数 K ,求 length 的期望值。
树的节点数不超过 50×50 |C|300 2K|C|
题解

在解决问题之前首先要明确 length 如何计算,即对于给定的点集 S ,经过 S 中所有点的最短路径长度应该怎么求。
由于本题给出的网格图是一个树,所以可以利用树的性质来解决问题。例如,树上任意两点 u,v 间简单路径唯一,且该路径为 u,v 间最短路径;树的每一条边都是割边,删除后导致 u,v 不连通当且仅当该边在 u v 的简单路径上,等等。
类比树上任意两点之间连通,可以得到一个基本的性质:
性质1 对于任意 SC a,bS ,存在一条从 a 出发经过 S 中所有点到达 b 的路径。
证明 设 S=v0,v1,...,v|S|1,其中 v0=a v|S|1=b ,构造路径 P ,先从 v0 v1 ,从 v1 v2 ,…,最后从 v|S|2 v|S|1 。因为 i(1,|S|] vi1 vi 在树上连通,所以这样构造的路径 P 一定是合法的。
P 是经过 S 中所有点的最短路径,将 S 中的点按照第一次被 P 经过的时间排序,记为 v0,v1,...,v|S|1,那么有:
性质2 P v0 为起点, v|S|1 为终点。
证明 假如 P 不以 v0 为起点,那么从 P 的起点到 v0 这一段路径没有经过 S 中的点,去掉后 P 更短,与 P 是最短路径矛盾。
类似地,如果 P 不以 v|S|1 为终点,则 v|S|1 之后的路径可以去掉。
性质3 i[1,|S|) P 中第一次经过 vi1 之后必沿着 vi1 vi 的简单路径到达 vi
证明 如果 P 中从第一次经过 vi1 到第一次经过 vi 这一段不是简单路径,那么改成简单路径后 P 更短,与 P 是最短路径矛盾。
性质4 边 eP 当且仅当删除 e S 中存在两点不连通(即 u,vS e u v 的简单路径上)。
证明 设删除 e 后存在 u,vS 不连通,那么删除 e 后不可能有 u,vP,因此要使 u,vP 必有 eP
如果删除 e 后任意 u,vS 仍连通,说明 u,vS e 不在 u v 的唯一简单路径上,因此 eP
性质5 任意边 e P 中经过最多 2 次。
证明 假设 e=(u,v) P 中出现了 3 次或以上,第 1 次为 uv,第 2 次为 vu,第 3 次为 uv,记 P 为第 1 次经过 e 后到第 2 次经过 e 前这一段从 v v 的路径,那么可以把第 1 次经过 e 前到第 2 次经过 e 后的路径( uv P vu )删掉,在第 3 次经过 e 后加上 P 这一段,这样 P 经过的点集不变但长度减少了 2,与 P 是最短路径矛盾。
性质6 边 e P 中经过恰 1 次当且仅当 v0 v|S|1 的简单路径包含 e
证明 若 v0 v|S|1 的简单路径包含 e ,那么删去 e v0 v|S|1 不连通,故必有 eP 。并且 e 不会在 P 中出现两次,否则若 e=(u,v) ,第一次为 uv ,第二次为 vu ,因之后不再经过 e ,故删掉 e v0 v|S|1 均与 u 在同一连通块,矛盾。
反过来,若边 e=(u,v) P 中经过恰 1 次,那么删去 e 后,v0 u 在同一连通块,v|S|1 v 在同一连通块,而 u,v 不连通,从而 e v0 v|S|1 的简单路径上。
根据以上性质,可以得到,对于点集 S ,若经过 S 中所有点的最短路径 P 起点为 u,终点为 v ,那么
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) 为路径 P 的长度,ES 为删除后会导致 S 中存在两点不连通的边集,即出现在某两点 u,vS 之间的简单路径上的所有边的集合, path(u,v) u,v 之间的简单路径的边集,显然 path(u,v)ES
显然要使 length(P) 最短,就要选择 u,v 使得 |path(u,v)| 最大,即 u,v S 中的最远点对。设 a,b S 中的最远点对,由性质1,必定存在从 a b 的合法路径,也就存在从 a b 的最短路径,即满足 (???)(???) 的路径。
从而,设 DS S 中最远点对(所有 u,vS 中, |path(u,v)| 的最大值)的距离,则
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 表示树的边集,显然 ESE E 的子集很多,不能枚举每个子集计算其概率。不过不难发现 E(ES)=eEP(eES),即 |ES| 的期望就是每条边出现在 ES 内的概率之和,可以从这个角度进行思考。
对于 eE eES 当且仅当删去 e 之后,S 中的点全在同一个连通块内。设 e 删去后的两个连通块 A,B(这里的连通块指的是点集)内属于 C 的点数分别为 s |C|s ,由于 C 的大小为 K 的子集 S (|C|K) 个,满足 SA S (sK) 个,满足 SB S (|C|sK) 个,且由于 |S|=K2>|AB|=0 ,所以 SA SB 互斥,故 eES 的概率 P(e∉ES)=(sK)(|C|K)+(|C|−sK)(|C|K)P(e∉ES)=(sK)(|C|K)+(|C|−sK)(|C|K)
因此 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 之后其中一个连通块中属于 C 的点数。这可以使用树形动态规划来求解:将无根树转成有根树,然后记 s(v) 为以 v 为根的子树中属于 C 的节点个数, c(v) v 的子节点集合。则可以计算所有的 s(v)

\begin{equation} s(v)=\sum{v'\in c(v)}s(v')+[v\in C] \label{TreeDP} \end{equation}

e=(u,v) ,则 u,v 必有一个是另一个的父节点,不妨设 u v 的父节点,那么 se=s(v)
这样就能在 O(|V|) 的时间内求出所有的 se ,进而在 O(|E|K)=O(|V|K) 的时间内求出 E(|ES|) ,其中 V 为树的点集,|V|=|E|+1。由于 |V|50×50=2500 K300 ,这一步运行是比较快的。
接着再考虑如何计算 E(DS) 。因为 C 中的点对只有 |C|23002 个,所以可以枚举点对 u,vC ,计算 u,v S 的最远点对的概率。当然最远点对不唯一,为了使其唯一,我们重新定义一个点对 u,v 的距离 d(u,v)=|path(u,v)|+2−h(u)+2−h(v)d(u,v)=|path(u,v)|+2−h(u)+2−h(v)
这里 h(v) 是对每个点 v 分配的编号,要求所有点的 h(v) 是两两不同的正整数,这样 d(u1,v1)=d(u2,v2) 要求两者的小数部分相同,即 2h(u1)+2h(v1)=2h(u2)+2h(v2) ,考虑两者的二进制表示可知仅当 u1,v1=u2,v2 时等式成立。于是不同的点对距离不同,最远点对就唯一了。
现在考虑计算 a,b S 的最远点对(所有 a,bS 中, d(a,b) 的最大值)的概率,那么需要满足的条件有
∀v∈S−a,b,maxd(v,a),d(v,b)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值