hihoCoder #1047 Random Tree
题意
给出点数为 $n$($n \le 1000$)的完全图 $K_n$,带边权。随机出 $K_n$ 的一棵生成树 $T$。求 $T$ 上任意两点间距离的期望。
解法
固定两点 $u$、$v$($u \le v$),考虑生成树 $T$ 上 $u$ 到 $v$ 的路径 $P_{uv}$。$P_{uv}$ 上的边可分成三类:
- $(u, v)$
- $(u, x)$、$(y, v)$,$x,y \notin \{u, v\}$
- $(x,y)$,$x, y \notin \{u, v\}$
第1类边出现在 $P_{uv}$ 上的概率为 $\dfrac{2}{n}$
每个第2类边出现在 $P_{uv}$ 上的概率为 $\dfrac{1-\dfrac{2}{n}}{n-2}=\dfrac{1}{n}$
考虑第3类边(对期望)的贡献。
首先应当注意到,所有第3类边出现在 $P_{uv}$ 上是等可能的,所以我们只需要求 $P_{uv}$ 上第三类边的数目的期望 $E(n)$。
用 $f(i)$ 表示 $K_n$ 的所有生成树中,满足「$P_{uv}$ 上点数为 $i$(包括两端点 $u$,$v$)」的生成树的数目。
我们分 3 步来求 $f(i)$:
固定 $P_{u,v}$,将 $P_{uv}$ 缩成一点 $w$,加上余下的 $n-i$ 个点,就得到一棵 $n-i+1$ 个点的树 $T'$。
将 $w$ 的度数固定为 $j$,对应的生成树 $T'$ 的数目 $g(j)$ 的表达式为
\begin{equation}
g(j) = \binom{n-i-1}{j-1}(n-i)^{n-i-j} \label{E:1}
\end{equation}
$\eqref{E:1}~$式可通过 Prufer 序列与树的一一对应关系得到。与 $w$ 相连的 $j$ 棵子树中的每一棵,在 $T$ 中可以连在 $P_{uv}$ 上的 $i$ 个点中的任意一个,所以我们得到
$$
\begin{equation}
\begin{aligned}
f(i) &= \mathrm{A}_{n-2}{i-2}\sum_{j=1}{n-i} g(j) \cdot i^{j} \\
&= \mathrm{A}_{n-2}{i-2}\sum_{j=1}{n-i} \binom{n-i-1}{j-1} (n-i)^{n-i-j} \cdot i^{j} \\
&= \mathrm{A}_{n-2}^{i-2}\cdot i \cdot \sum_{j'=0}^{n-i-1} \binom{n-i-1}{j'}(n-i)^{n-i-1-j'} \cdot i^{j'} \\
&= \mathrm{A}_{n-2}^{i-2} \cdot i \cdot n^{n-i-1} \label{E:2}
\end{aligned}
\end{equation}
$$
从而
$$
\begin{equation}
\begin{aligned}
E(n) &= \frac{\sum\limits_{i=4}^{n} f(i)(i-3)}{n^{n-2}} \\
&= \sum_{i=4}^{n} \frac{\mathrm{A}_{n-2}{i-2}i(i-3)}{n{i-1}}
\end{aligned}
\end{equation}
$$
Implementation
#include <bits/stdc++.h>
using namespace std;
using DB=long double;
const int N=1005;
DB res[N][N];
int a[N][N];
DB calc(int n){
if(n<=3) return 0;
DB pn=1;
for(int i=1; i<=n-2; i++)
pn*=i, pn/=n;
// cout << pn << endl;
DB sum=pn*(n-3);
for(int i=n-1; i>=4; i--)
pn*=n*i, pn/=(n-i)*(i+1), sum+=pn*(i-3);
return sum;
}
int main(){
// int cnt=0;
// for(int i=0; i<=1000; i++)
// cnt+=fabs(t[i]-calc(i))>1e-50;
// cout << cnt << endl;
int n, tot=0;
scanf("%d", &n);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d", a[i]+j), a[i][0]+=a[i][j], tot+=a[i][j];
tot/=2;
DB x=calc(n);
for(int i=1; i<n; i++)
for(int j=i+1; j<=n; j++){
res[i][j]=(a[i][0]+a[j][0])/DB(n);
if(n>=4) // 注意:n=2 或 3 时,分母为 0
res[i][j]+=x*(tot-a[i][0]-a[j][0]+a[i][j])/((n-2)*(n-3)/2);
res[j][i]=res[i][j];
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
printf("%.9Lf%c", res[i][j], j==n?'\n':' ');
return 0;
}
hihoCoder #1047 Random Tree的更多相关文章
- Jquery EasyUI 开发实录
有好几年没有用过EasyUI了,最近在外包做的一个项目中新增功能时,又用到了,本以为和按照以前那样用就可以了,可当我真正用的时候,发现许多地方不一样了,就连官网的文档都更新了,最突出的就是不知道什么时 ...
- WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)
声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析, ...
- [ActionScript 3.0] Away3D 官网实例
/* Dynamic tree generation and placement in a night-time scene Demonstrates: How to create a height ...
- 给Lisp程序员的Python简介
给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<zzljlu@gmail.com> 这是一篇为Lisp程序员写的Python简介(一些Pyth ...
- planning深度剖析
planning深度剖析 结合find命令过滤目录及文件名后缀: find /home/hadoop/nisj/automationDemand/ -type f -name '*.py'|xargs ...
- RRT路径规划算法
传统的路径规划算法有人工势场法.模糊规则法.遗传算法.神经网络.模拟退火算法.蚁群优化算法等.但这些方法都需要在一个确定的空间内对障碍物进行建模,计算复杂度与机器人自由度呈指数关系,不适合解决多自由度 ...
- CVPR 2015 papers
CVPR2015 Papers震撼来袭! CVPR 2015的文章可以下载了,如果链接无法下载,可以在Google上通过搜索paper名字下载(友情提示:可以使用filetype:pdf命令). Go ...
- 学习笔记:MDN的JavaScript
JavaScript 第一步 什么是JavaScript? 每次当你浏览网页时不只是显示静态信息—— 显示即时更新的内容, 或者交互式的地图,或 2D/3D 图形动画,又或者自动播放视频等,你可以确信 ...
- Face alignment at 3000FPS via Regressing Local Binrary features 理解
这篇是Ren Shaoqing发表在cvpr2014上的paper,论文是在CPR框架下做的,想了解CPR的同学可以参见我之前的博客,网上有同学给出了code,该code部分实现了LBF,链接为htt ...
随机推荐
- BZOJ 3130: [Sdoi2013]费用流 网络流+二分
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1230 Solved: ...
- cv2.Canny 边缘检测
Canny边缘检测 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘. 好的定位 - 标识出的边缘要尽可能与实际图像中 ...
- 校招准备-关系型数据库与nosql
深入理解常见的数据库的设计架构, 其中用到的数据结构, 算法等 SQL执行流程和优化, 可以了解一下calcite: https://calcite.apache.org/
- 用 label 控制 Pod 的位置
默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node.不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Nod ...
- Java 从资源文件(.properties)中读取数据
在Java工程目录src下,创建一个后缀为.properties的文件,例如db.properties 文件中的内容如下(键=值): name=mk age=123 address=China 在程序 ...
- PAT (Basic Level) Practise (中文)- 1008. 数组元素循环右移问题 (20)
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1 A0 ...
- python-下拉框处理
在自动化中python对下拉框的处理网上相对实例比较少,其它前辈写的教程中对下拉也仅仅是相对与教程来说的,比如下面: m=driver.find_element_by_id("Shippin ...
- 转 Solr vs. Elasticsearch谁是开源搜索引擎王者
转 https://www.cnblogs.com/xiaoqi/p/6545314.html Solr vs. Elasticsearch谁是开源搜索引擎王者 当前是云计算和数据快速增长的时代,今天 ...
- Linux菜鸟起飞之路【九】系统启动流程
Linux系统启动流程 BIOS -> MBR -> BootLoader -> Kernel -> init 1.打开电源后,计算机从主板的BIOS中读取其中存储的程序.这 ...
- PHPExcel探索之旅
学习地址: https://www.imooc.com/video/8359 下载地址: https://packagist.org/packages/phpoffice/phpexcel 用comp ...