zoukankan      html  css  js  c++  java
  • Prufer序列

    Prufer序列

    Prufer 序列可以将一个带标号(n)个结点的无根树用(n-2)([1,n])的整数表示。也可以理解为完全图的生成树与数列之间的双射。

    带标号无根树与(Prufer)序列是一一对应的。

    无根树转Prufer序列

    有一棵带标号无根树。它的(Prufer)序列构造如下:

     每次选择一个编号最小的叶结点并删掉它,然后在序列中记下和它相邻的那个结点的编号。反复执行操作直到只剩下两个结点。

    Prufer序列转无根树

    有一个(Prufer)序列和(n)个点的点集。转回无根树就是:

     每次取出(Prufer)序列中最前面的元素(x),和点集中编号最小的不在(Prufer)序列的元素(y),给(x,y)连边之后分别删去。最后点集中剩下两个结点,把它们连边。

    性质

    • (Prufer)序列中每个编号出现次数等于该结点在原树中的度数-1。(只有作为叶子被删去时不会加入序列中)

    Cayley′s Formula

    因为(Prufer)序列和原树是一一对应的关系,所以

    • (n)个点带标号无根树的方案数为(n^{n-2})

    (Ex)

    1.如果给定每个点度数$d_1,d_2,dots,d_n $,那么

    • 对应的无根树的数量为(frac{(n-2)!}{prod_{i=1}^n(d_i-1)!})

      相当于是已经确定了序列中的元素,现在只用算多重集的排列数。

    2.(n)个点其中(k)个给定度数,令(s=sum_{i=1}^k(d_i-1))

    • 对应的无根树数量(inom{n-2}{s}frac{s!}{prod_{i=1}^k(d_i-1)!}(n-k)^{n-2-s})

      就是这(s)个排列了之后剩下的位置随便填。

    3.有(n)个带权的点,边权为连接的点权之积,树的权值为边权之积。求所有树的权值之和。

    ​ 设点(i)的权值为(val_i),度数为(d_i),那么一棵树的权值就是(prod_{i=1}^nval_i^{d_i})

    ​ 考虑利用(Prufer)序列计算。根据乘法分配率

    • 答案是((prod_{i=1}^nval_i)(sum_{i=1}^nval_i)^{n-2})

      第一项就是考虑到每个点在(Prufer)序列恰出现(d_i-1)次,所以要补一次。

    Generalized Cayley′s Formula

    (n)个点构成(m)棵有标号无根树,且指定其中(m)个点不在同一棵树上。

    • 方案数为(f(n,m)=mn^{n-m-1})

    (m=1)时有(f(n,1)=n^{n-2}),即Cayley′s Formula。

    可以归纳证明:首先对于任意(n)(f(n,0)=0)(f(n,1)=n^{n-2}),这是边界。

    我们假设对于所有(i<n)(f(i,m)=mi^{i-m-1})恒成立。要证(f(n,m)=mn^{n-m-1})

    方便起见,我们枚举1号点的度数(i),以及与1号点相连的那(i)个点,那么在去掉1号点之后,会留下(n-1)个点和(m+i-1)棵树(常用的缩小规模手段要学会)。即:

    [egin{align} f(n,m)=&sumlimits_{i=0}^{n-m}inom{n-m}{i}f(n-1,m+i-1)\ =&sumlimits_{i=0}^{n-m}inom{n-m}{i}(m+i-1)(n-1)^{n-m-i-1}\ end{align} ]

    (i=n-m-i),则有:

    [egin{align} f(n,m)=&sumlimits_{i=0}^{n-m}inom{n-m}{i}(n-i-1)(n-1)^{i-1}\ =&sumlimits_{i=0}^{n-m}inom{n-m}{i}(n-1)^i-sumlimits_{i=0}^{n-m}inom{n-m}{i}i(n-1)^{i-1}\ =&sumlimits_{i=0}^{n-m}inom{n-m}{i}(n-1)^i-sumlimits_{i=1}^{n-m}inom{n-m}{i}i(n-1)^{i-1} end{align} ]

    第二步到第三步是因为(i=0)时这一项乘了个(i)所以结果就是0。

    前面一项,用二项式定理变成(n^{n-m});后面一项把(i)丢进组合数里约分,(inom{n-m}{i}i)变成((n-m)inom{n-m-1}{i-1})

    [egin{align} f(n,m)=&n^{n-m}-(n-m)sumlimits_{i=1}^{n-m}inom{n-m-1}{i-1}(n-1)^{i-1}\ =&n^{n-m}-(n-m)sumlimits_{i=0}^{n-m-1}inom{n-m-1}{i}(n-1)^{i}\ =&n^{n-m}-(n-m)n^{n-m-1}\ =&mn^{n-m-1} end{align} ]

    (Q.E.D.)

    图联通方案数

    Problem to solve(n)个点(m)条边的带标号无向图形成(k)个联通块。添加(k-1)条边使得图联通的方案数。

    (s_i)表示第(i)个联通块中点的数量。我们现在是要对(k)个联通块构造(Prufer)序列。但是因为每个联通块连接方式很多,所以不能直接简单构造。

    考虑设(d_i)为第(i)个联通块的度数。有(sumlimits_{i=1}^kd_i-1=k-2)(两边同时加(k)就是(sumlimits_{i=1}^kd_i=2k-2),即度数和是边数的两倍),那么对于给定(d)序列构造(Prufer)序列的方案数有

    [inom{k-2}{d_1-1,d_2-1,dots,d_k-1}=frac{(k-2)!}{(d_1-1)!(d_2-1)!dots(d_k-1)!} ]

    这和Cayley′s Formula的(Ex1.)是一样的。

    对于第(i)个联通块,它的连接方式有(s_i^{d_i})种,因为每一条边可以选择任意点连接。那么对于给定(d)序列的图,使其联通的方案数为

    [inom{k-2}{d_1-1,d_2-1,dots,d_k-1}cdot prodlimits_{i=1}^ks_i^{d_i} ]

    所有方案就是再枚举一个(d)序列:

    [sumlimits_{d_igeq 1,sum_{i=1}^kd_i=2k-2}inom{k-2}{d_1-1,d_2-1,dots,d_k-1}cdot prodlimits_{i=1}^ks_i^{d_i} ]

    由多元二项式定理:

    [(x_1+x_2+dots+x_m)^p=sumlimits_{c_ige0,sum_{i=1}^mc_i=p}inom{p}{c_1,c_2,dots,c_m}cdot prod x_i^{c_i} ]

    (e_i=d_i-1),原式变成:

    [egin{align} &sumlimits_{e_igeq 0,sum_{i=1}^ke_i=k-2}inom{k-2}{e_1,e_2,dots,e_k}cdot prodlimits_{i=1}^ks_i^{e_i+1}\ &=(s_1+s_2+dots+s_k)^{k-2}cdot prodlimits_{i=1}^ks_i end{align} ]

    转自:

    https://oi-wiki.org/graph/prufer/

    https://blog.csdn.net/weixin_34227447/article/details/93649135

  • 相关阅读:
    hive: insert数据时Error during job, obtaining debugging information 以及beyond physical memory limits
    hadoop性能调优
    mysql主键,外键,索引
    Hive语法
    Hbase配置java客户端
    Hive命令及操作
    sqoop:mysql和Hbase/Hive/Hdfs之间相互导入数据
    mysql字符设置
    linux及hadoop修改权限
    Scalaz(55)- scalaz-stream: fs2-基础介绍,fs2 stream transformation
  • 原文地址:https://www.cnblogs.com/fruitea/p/12164236.html
Copyright © 2011-2022 走看看