hihoCoder #1047 Random Tree

题意

给出点数为 nn1000)的完全图 Kn,带边权。随机出 Kn 的一棵生成树 T。求 T 上任意两点间距离的期望。

解法

固定两点 uvuv),考虑生成树 Tuv 的路径 PuvPuv 上的边可分成三类:

  1. (u,v)
  2. (u,x)(y,v)x,yu,v
  3. (x,y)x,yu,v

第1类边出现在 Puv 上的概率为 2n
每个第2类边出现在 Puv 上的概率为 12nn2=1n

考虑第3类边(对期望)的贡献。

首先应当注意到,所有第3类边出现在 Puv 上是等可能的,所以我们只需要求 Puv 上第三类边的数目的期望 E(n)

f(i) 表示 Kn 的所有生成树中,满足「Puv 上点数为 i(包括两端点 uv)」的生成树的数目。
我们分 3 步来求 f(i)

  1. 固定 Pu,v,将 Puv 缩成一点 w,加上余下的 ni 个点,就得到一棵 ni+1 个点的树 T

  2. w 的度数固定为 j,对应的生成树 T 的数目 g(j) 的表达式为
    (1)g(j)=(ni1j1)(ni)nij
    (1) 式可通过 Prufer 序列与树的一一对应关系得到。

  3. w 相连的 j 棵子树中的每一棵,在 T 中可以连在 Puv 上的 i 个点中的任意一个,所以我们得到

(2)f(i)=A_n2i2_j=1nig(j)ij=A_n2i2_j=1ni(ni1j1)(ni)nijij=A_n2i2i_j=0ni1(ni1j)(ni)ni1jij=A_n2i2inni1

从而

(3)E(n)=i=4nf(i)(i3)nn2=i=4nAn2i2i(i3)ni1

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;
}
posted @   Pat  阅读(373)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
点击右上角即可分享
微信分享提示