Prufer数列学习笔记

0 前言

本篇由本人原博客搬运至此。

感谢 Echo 对于 2.1 部分的指正。

1 导语

Prufer数列是无根树的一种数列。构造简单,具有很优秀的性质。Prufer数列是生成树计数的一个巧妙工具。

2 介绍

2.1 从树到Prufer数列

一棵n个有编号节点的无根树对应唯一的一串长度为n-2的Prufer数列。而我们可以用迭代删点的方式生成Prufer数列。

定义无向连通图 G=(V,E) G = ( V , E ) |V|=|E|+1 | V | = | E | + 1 。我们定义叶子节点为度数为1的节点。然后按以下步骤:

  1. 找到一个节点 uV u ∈ V ,满足 degu=1 d e g u = 1 的最小的 u u ,记下 u u 和边 (u,v)E ( u , v ) ∈ E

  2. 在Prufer数列中加入节点 vV v ∈ V ,在原图中删去 u u 和边 (u,v) ( u , v )

  3. 如果 |V|=2 | V | = 2 则停止,否则重复1,2。

Prufer数列学习笔记_第1张图片

比如上图:

  1. 找到4,在数列中加入1,删除4及其连边

  2. 找到5,在数列中加入2,删除5及其连边

  3. 找到6,在数列中加入2,删除6及其连边

  4. 找到2,在数列中加入1,删除2及其连边

  5. 找到7,在数列中加入3,删除7及其连边

结束,得到数列 [1,2,2,1,3]。

2.2 从Prufer数列到树

​ 一串长度为n-2的Prufer数列对应唯一的一棵n个有编号节点的无根树。

  1. 取出Prufer数列最前面的元素 u u ,删除 u u

  2. 在点集 V V 中找到最小的没有在Prufer数列中出现的元素 v v 。节点 vV v ∈ V ,连接边 (u,v) ( u , v ) . 在 V V 中删除 (u,v) ( u , v )

  3. 如果 |V|=2 | V | = 2 则将剩余的两个点连边后停止,否则重复1,2。

举例省略。

2.3 性质

Prufer数列具有许多优秀的性质。

  1. Prufer数列中某个编号出现的次数+1等于该编号节点在无根树中的度数。因为某个编号 p p 出现一次,就代表有一个连向 p p 的点。而且必然还存在一个连向 p p 的点,来让 p p 从点集中消失。

  2. 唯一性。一个Prufer数列和一棵无根树是互相唯一对应的。

  3. Caylay公式:对于一张完全图 G=(V,E) G = ( V , E ) |V|=n | V | = n 。则该图生成树个数为 nn2 n n − 2 。完全图中,每个点的度数均为n-1。则Prufer数列中一个点出现次数至多为n-2。又由于该Prufer数列长度为n-2,所以每一个位置都有n种可能。所以该图生成树个数为 nn2 n n − 2

3 实例

3.1 Caylay公式推广

对于未给定的无向连通图 G=(V,E) G = ( V , E ) ,已知 |V| | V | ,且 |V|=|E|+1 | V | = | E | + 1 ,节点两两不同(看做有编号)。已知节点 uV u ∈ V 的度 degu d e g u 。求满足条件的 G G 有多少种。

解答:显然无向图 G G 是一棵树。既然已知点度,我们可以想到性质1.

因为节点 uV u ∈ V 的度为 degu d e g u ,则 u u G G 所对应的Prufer数列中出现的次数为 degu1 d e g u − 1

那么问题转化为,对于数集 A=1,2,3,...,n A = 1 , 2 , 3 , . . . , n ,定义 f(x) f ( x ) 为对 x x ∈ 在数列中出现次数。求数列B的方案数,满足 xB,f(x)=degx ∀ x ∈ B , f ( x ) = d e g x

​ 方案数为 Cdeg11n2×Cdeg21n2(deg11)×...×Cdegn1n2(deg11+deg21+...+degn11) 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

(n2)!ni=1(degi1)! ( n − 2 ) ! ∏ i = 1 n ( d e g i − 1 ) !

3.2 [BZOJ1005]明明的烦恼

​ 自从明明学了树的结构,就对奇怪的树产生了兴趣……给出标号为1到n的点 (n1000) ( n ≤ 1000 ) ,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树?

​ 解答:我们将点分成两部分:有规定度数的点和未规定度数的点。然后两部分分别构造生成树。

​ 令有规定度数的点有 k k 个,将有规定度数的点做完后无根树对应的Prufer数列剩余位置为 l l 。则 l=n2ki=1(degi1) l = n − 2 − ∑ i = 1 k ( d e g i − 1 )

有规定度数的部分同2.1,即

Cdeg11n2×Cdeg21n2(deg11)×...×Cdegk1n2(deg11+deg21+...+degk11) 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 k − 1 − 1 ) d e g k − 1

未规定度数的点当成完全图求生成树处理,即

(nk)l ( n − k ) l

二者相乘,得

(n2)!ni=1(degi1)!×l!×(nk)l ( n − 2 ) ! ∏ i = 1 n ( d e g i − 1 ) ! × l ! × ( n − k ) l

你可能感兴趣的:(数论)