本篇由本人原博客搬运至此。
感谢 Echo 对于 2.1 部分的指正。
Prufer数列是无根树的一种数列。构造简单,具有很优秀的性质。Prufer数列是生成树计数的一个巧妙工具。
一棵n个有编号节点的无根树对应唯一的一串长度为n-2的Prufer数列。而我们可以用迭代删点的方式生成Prufer数列。
定义无向连通图 G=(V,E) G = ( V , E ) , |V|=|E|+1 | V | = | E | + 1 。我们定义叶子节点为度数为1的节点。然后按以下步骤:
找到一个节点 u∈V u ∈ V ,满足 degu=1 d e g u = 1 的最小的 u u ,记下 u u 和边 (u,v)∈E ( u , v ) ∈ E 。
在Prufer数列中加入节点 v∈V v ∈ V ,在原图中删去 u u 和边 (u,v) ( u , v ) 。
如果 |V|=2 | V | = 2 则停止,否则重复1,2。
比如上图:
找到4,在数列中加入1,删除4及其连边
找到5,在数列中加入2,删除5及其连边
找到6,在数列中加入2,删除6及其连边
找到2,在数列中加入1,删除2及其连边
找到7,在数列中加入3,删除7及其连边
结束,得到数列 [1,2,2,1,3]。
一串长度为n-2的Prufer数列对应唯一的一棵n个有编号节点的无根树。
取出Prufer数列最前面的元素 u u ,删除 u u 。
在点集 V V 中找到最小的没有在Prufer数列中出现的元素 v v 。节点 v∈V v ∈ V ,连接边 (u,v) ( u , v ) . 在 V V 中删除 (u,v) ( u , v ) 。
如果 |V|=2 | V | = 2 则将剩余的两个点连边后停止,否则重复1,2。
举例省略。
Prufer数列具有许多优秀的性质。
Prufer数列中某个编号出现的次数+1等于该编号节点在无根树中的度数。因为某个编号 p p 出现一次,就代表有一个连向 p p 的点。而且必然还存在一个连向 p p 的点,来让 p p 从点集中消失。
唯一性。一个Prufer数列和一棵无根树是互相唯一对应的。
Caylay公式:对于一张完全图 G=(V,E) G = ( V , E ) , |V|=n | V | = n 。则该图生成树个数为 nn−2 n n − 2 。完全图中,每个点的度数均为n-1。则Prufer数列中一个点出现次数至多为n-2。又由于该Prufer数列长度为n-2,所以每一个位置都有n种可能。所以该图生成树个数为 nn−2 n n − 2 。
对于未给定的无向连通图 G=(V,E) G = ( V , E ) ,已知 |V| | V | ,且 |V|=|E|+1 | V | = | E | + 1 ,节点两两不同(看做有编号)。已知节点 u∈V u ∈ V 的度 degu d e g u 。求满足条件的 G G 有多少种。
解答:显然无向图 G G 是一棵树。既然已知点度,我们可以想到性质1.
因为节点 u∈V u ∈ V 的度为 degu d e g u ,则 u u 在 G G 所对应的Prufer数列中出现的次数为 degu−1 d e g u − 1 。
那么问题转化为,对于数集 A=1,2,3,...,n A = 1 , 2 , 3 , . . . , n ,定义 f(x) f ( x ) 为对 x∈ x ∈ 在数列中出现次数。求数列B的方案数,满足 ∀x∈B,f(x)=degx ∀ x ∈ B , f ( x ) = d e g x 。
方案数为 Cdeg1−1n−2×Cdeg2−1n−2−(deg1−1)×...×Cdegn−1n−2−(deg1−1+deg2−1+...+degn−1−1) C n − 2 d e g 1 − 1 × C n − 2 − ( d e g 1 − 1 ) d e g 2 − 1 × . . . × C n − 2 − ( d e g 1 − 1 + d e g 2 − 1 + . . . + d e g n − 1 − 1 ) d e g n − 1
即
自从明明学了树的结构,就对奇怪的树产生了兴趣……给出标号为1到n的点 (n≤1000) ( n ≤ 1000 ) ,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树?
解答:我们将点分成两部分:有规定度数的点和未规定度数的点。然后两部分分别构造生成树。
令有规定度数的点有 k k 个,将有规定度数的点做完后无根树对应的Prufer数列剩余位置为 l l 。则 l=n−2−∑ki=1(degi−1) l = n − 2 − ∑ i = 1 k ( d e g i − 1 )
有规定度数的部分同2.1,即
未规定度数的点当成完全图求生成树处理,即
二者相乘,得