ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

prufer序列

2022-09-03 20:02:56  阅读:131  来源: 互联网

标签:度数 叶子 父亲 序列 prufer 节点


prufer序列,一种把有标号树用唯一的整数序列表示。它可以将一个带标号\(n\)个结点的树用\(n-2\)个整数表示。

建立方法非常简单:每次找到无根树上编号最小的一个叶子,删掉它并记录它的父亲编号,重复\(n-2\)次,直到只剩下两个节点结束。

我们可以以线性的复杂度使一棵树在树和prufer序列之间相互转换。(以下树的形态为其父亲序列,即序列中\(f_i\)为节点\(i\)在\(n\)为根时的父亲)

  1. 从树到prufer序列

当然我们可以\(O(n^2)\)暴力找每个最小的叶子删掉然后记录父亲。当然仅限于可以,能不能过两码事。

当然我们还可以开个堆保存每个节点的度数,复杂度\(O(n\log n)\)。

但是更优秀的方法是拿指针扫一遍。指针从小到大扫,找到第一个指针扫到的叶子并记录它的父亲,父亲度数\(-1\)。如果这一操作产生了新的比当前节点小的叶子,则继续加入序列中。

void father_to_prufer(){
	for(int i=1;i<n;i++){
		scanf("%lld",&f[i]);
		d[f[i]]++;//记录每个父亲的权值 
	}
	for(int i=1,j=1;i<=n-2;i++,j++){
		while(d[j])j++;//指针往上跳 
		p[i]=f[j];
		while(i<=n-2&&p[i]<j&&!--d[p[i]]){//顺序不要搞错 最后再自减 
			p[i+1]=f[p[i]];i++;//有减到0的进入序列 
		}
	}
}

这个做法显然正确:当产生新的叶子时:

  1. 如果叶子比当前节点大,直接不管。
  2. 反之它一定是最小的叶子,直接更新。

树转成prufer序列就这样。

  1. 从头prufer序列到树

和上一个的逻辑差不多,就是有个要注意的点,最后多放一个根要不然根转不完。

void ptf(){
	for(int i=1;i<=n-2;i++){
		scanf("%lld",&p[i]);d[p[i]]++;
	}
	p[n-1]=n;//注意要记录一下根节点 
	for(int i=1,j=1;i<n;i++,j++){
		while(d[j])++j; 
		f[j]=p[i];
		while(i<n&&p[i]<j&&!--d[p[i]]){
			f[p[i]]=p[i+1];i++;
		}
	}
}

好了上面的东西都是纯扯淡,应该没人考你这个。引用一句话:

显然你不会想不开拿这玩意儿去维护树结构。这玩意儿常用组合计数问题上。
$\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ $——OI WiKi

然后是这玩意真正的应用:计数。

举个例子:凯莱定理:\(n\)个点的完全图有\(n^{n-2}\)棵生成树。

证明:显然\(K_n\)的prufer序列有\(n-2\)个数,每个数都可以从\([1,n]\)中选,总共\(n^{n-2}\)种。

另一个小结论:
对于给定度数为\(d_{1\sim n}\)的一棵无根树共有$\frac{(n-2)!}{\prod_{i=1}^n(d_i-1)!} $种情况。证明很简单,prufer序列上跑重排列就行了。

标签:度数,叶子,父亲,序列,prufer,节点
来源: https://www.cnblogs.com/gtm1514/p/16653402.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有