题意

给出点数为 $n$($n \le 1000$)的完全图 $K_n$,带边权。随机出 $K_n$ 的一棵生成树 $T$。求 $T$ 上任意两点间距离的期望。

解法

固定两点 $u$、$v$($u \le v$),考虑生成树 $T$ 上 $u$ 到 $v$ 的路径 $P_{uv}$。$P_{uv}$ 上的边可分成三类:

  1. $(u, v)$
  2. $(u, x)$、$(y, v)$,$x,y \notin \{u, v\}$
  3. $(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)$:

  1. 固定 $P_{u,v}$,将 $P_{uv}$ 缩成一点 $w$,加上余下的 $n-i$ 个点,就得到一棵 $n-i+1$ 个点的树 $T'$。

  2. 将 $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 序列与树的一一对应关系得到。

  3. 与 $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的更多相关文章

  1. Jquery EasyUI 开发实录

    有好几年没有用过EasyUI了,最近在外包做的一个项目中新增功能时,又用到了,本以为和按照以前那样用就可以了,可当我真正用的时候,发现许多地方不一样了,就连官网的文档都更新了,最突出的就是不知道什么时 ...

  2. WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)

    声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析, ...

  3. [ActionScript 3.0] Away3D 官网实例

    /* Dynamic tree generation and placement in a night-time scene Demonstrates: How to create a height ...

  4. 给Lisp程序员的Python简介

    给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<zzljlu@gmail.com> 这是一篇为Lisp程序员写的Python简介(一些Pyth ...

  5. planning深度剖析

    planning深度剖析 结合find命令过滤目录及文件名后缀: find /home/hadoop/nisj/automationDemand/ -type f -name '*.py'|xargs ...

  6. RRT路径规划算法

    传统的路径规划算法有人工势场法.模糊规则法.遗传算法.神经网络.模拟退火算法.蚁群优化算法等.但这些方法都需要在一个确定的空间内对障碍物进行建模,计算复杂度与机器人自由度呈指数关系,不适合解决多自由度 ...

  7. CVPR 2015 papers

    CVPR2015 Papers震撼来袭! CVPR 2015的文章可以下载了,如果链接无法下载,可以在Google上通过搜索paper名字下载(友情提示:可以使用filetype:pdf命令). Go ...

  8. 学习笔记:MDN的JavaScript

    JavaScript 第一步 什么是JavaScript? 每次当你浏览网页时不只是显示静态信息—— 显示即时更新的内容, 或者交互式的地图,或 2D/3D 图形动画,又或者自动播放视频等,你可以确信 ...

  9. Face alignment at 3000FPS via Regressing Local Binrary features 理解

    这篇是Ren Shaoqing发表在cvpr2014上的paper,论文是在CPR框架下做的,想了解CPR的同学可以参见我之前的博客,网上有同学给出了code,该code部分实现了LBF,链接为htt ...

随机推荐

  1. db2疑难解决

    http://www-01.ibm.com/support/knowledgecenter/?lang=zh#!/SSEPGG_9.5.0/com.ibm.db2.luw.messages.sql.d ...

  2. Python——三目运算符

    一.三目运算符 1.if语句三目运算符语法格式 Python可以通过if'语句来实现三目运算符的功能,因此可以把这种if语句当做三目运算符,具体语法格式如下: 返回True执行 if 表达式 else ...

  3. 解决在matplotlib使用中文的问题

    原生的matplotlib并不支持直接使用中文,而需要修改一下相应的文件,上网搜了下,找到一个最简洁的办法. NO.1 找到matplotlibrc文件 C:\Python26\Lib\site-pa ...

  4. 关键字final

    final数据 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改:如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象.再次赋值将引起编译报错. 当f ...

  5. Windows10 关闭自动更新

    win+R调出运行窗口: 输入services.msc,查找 跳出服务窗口,点击windows update设置禁用即可 Windows Update Medic Service没办法禁用,需要采用其 ...

  6. Lecture 2

    1. Coordinate(坐标) data for GIS real coordinate system:Cartesian coordinate systems(笛卡尔坐标系) from 3D t ...

  7. LeetCode(283)Move Zeroes

    题目 Given an array nums, write a function to move all 0's to the end of it while maintaining the rela ...

  8. MySQL使用yum安装

    1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2.安装mysql-comm ...

  9. HDU 5238 Calculator 线段树 中国剩余定理

    题意: 给一个计算器,有一系列计算步骤,只有加,乘,幂三种运算. 有一种查询操作:查询初始值为\(x\)的时候,最终运算结果模\(29393\)的值. 有一种修改操作:可以修改第\(p\)个运算的运算 ...

  10. HDU 5236 Article 期望

    题意: 你现在要打\(n\)个字符,但是程序随时可能会崩溃. 你可以在恰当的时机按下 \(Ctrl-S\)键,崩溃后,会从最后一次保存的情况继续开始打字. 具体是这样的: 在每个第\(i-0.1s(i ...