首页 > 其他分享 >Prüfer 序列

Prüfer 序列

时间:2024-02-27 18:11:17浏览次数:13  
标签:Pr 个点 叶子 fer 序列 节点

大部分都是贴网上的。

Prüfer 序列是一个长度为 \(n-2\),值域为 \([1,n]\) 的整数序列。
每棵树必定存在 Prüfer 序列且唯一,每个 Prüfer 序列对应的树也必定存在且唯一,即二者为双射关系。

Prüfer 序列是这样从树转化的:

从树上选择编号最小的叶子节点,序列的下一位为其父节点的编号。

删去该叶子节点。

重复 ,直到树只剩下两个节点,此时序列的长度刚好为 \(n-2\)

Prüfer 序列构造的过程,我们可以发现其具有两个显而易见的性质。

  1. 构造完后剩下的两个节点里,一定有一个是编号最大的节点。

  2. 对于一个 \(n\) 度的节点,其必定在序列中出现 \(n-1\) 次,因为每次删去其子节点它都会出现一次,最后一次则是删除其本身。一次都未出现的是原树的叶子节点。

Prüfer 序列重构树:

选择编号最小的叶子节点(即未出现在序列中的节点),其父节点就是序列的第 \(i\)(\(i\) 初始为1)个元素。

由性质可得,其父节点的度数为其出现次数 \(+1\)。将该叶子节点删去,其父节点度数 \(-1\)。若度数变成 \(1\),则父节点也成为叶子节点。

将 \(i\) 加一,然后重复 ,直到序列的每一个元素都使用完毕。

\(\text{应用}\)

  1. 无向完全图的不同生成树数:

若该完全图有 \(n\) 个节点,则任意一个长度为 \(n-2\) 的 Prüfer 序列都可以重构出其一棵生成树,且各不相同。又因为 Prüfer 序列的值域在 \([1,n]\),故总数为 \(n^{n-2}\)。
这就是有名的 \(Cayley\) 公式。

  1. \(n\) 个点的无根树计数:

同上问题。

  1. \(n\) 个点的有根树计数:
    对每棵无根树来说,每个点都可能是根,故总数为 \(n^{n-1}\)。

  2. \(n\) 个点,每点度分别为 \(a_i\) 的无根树计数:
    总排列为 \((n-2)!\),其中数字 \(i\) 出现了 \(a_i-1\) 次,故其重复的有 \((a_i-1)!\) 种排列。
    应当除去重复的,故总个数为 \(\frac{(n-2)!}{\prod (a_i-1)!}\)。

代码,\(m=1\) 为树转 Prüfer ,\(m=2\) 为 Prüfer 转树:

#include<bits/stdc++.h>
const int N=5e6+5;
#define o(n) for(int i=1;i<n;++i)
int n,g[N],e[N],m,d[N],ct;
int main(){
    std::cin>>n>>m;
    if(m&1)o(n)std::cin>>g[i],d[g[i]]++;
    else o(n-1)std::cin>>e[i],d[e[i]]++;
    int p=n,l,f;
    o(n+1)if(!d[i]){p=i;break;}l=p;
    while(ct<n-2){
        if(m&1)f=g[l],e[++ct]=f;else f=g[l]=e[++ct];
        if(!--d[f]&&f<p)l=f;else {p++;while(d[p])++p;l=p;}
    }
    g[l]=n;o(n-(m&1))std::cout<<(m==1?e[i]:g[i])<<" ";
    return 0;
}

标签:Pr,个点,叶子,fer,序列,节点
From: https://www.cnblogs.com/Saka-Noa/p/18037502

相关文章

  • 卡特兰数、Prüfer 序列、BSGS
    1卡特兰数1.1概述卡特兰数的前几项是$1,1,2,5,14,42,132,429,1430,4862\cdots$。卡特兰数在组合数学中有着许多应用。下面给出一个经典例子:在网格中向右或向上走,从$(0,0)$走到$(n,n)$,并且不能越过对角线的路径条数。该问题的结果就是卡特兰数,记为$H_n$。1.2通项公......
  • springboot 统一处理请求非法参数
    通过拦截器和过滤器实现,话不多说上代码。1、重写HttpServletRequestWrapper读取body里面的内容。publicclassRequestWrapperextendsHttpServletRequestWrapper{privatefinalStringbody;publicRequestWrapper(HttpServletRequestrequest){super......
  • 如何创建自己的Spring Boot Starter并为其编写单元测试
    当我们想要封装一些自定义功能给别人使用的时候,创建SpringBootStarter的形式是最好的实现方式。如果您还不会构建自己的SpringBootStarter的话,本文将带你一起创建一个自己的SpringBootStarter。快速入门创建一个新的Maven项目。第三方封装的命名格式是xxx-spring-boo......
  • 函数进阶(作用域、内置函数、defer、panic、recover)
    目录一、作用域1.全局作用域2.局部作用域(1)局部变量和全局变量的名不同(2)局部变量和全局变量的名相同二、函数类型与变量三、defer方法1.什么是defer2.defer的执行时机3.defer语句中函数参数为执行函数4.for循环中的defer四、内置函数五、panic和recover1.简单示例一、作用......
  • 936 戳印序列
    原题链接题解:逆序思维我们如果正着考虑戳印序列,那么题目会很复杂,但是如果我们倒着考虑,即最后按下的戳印位置一定和stamp一一对应,然后将该位置改为?后再取匹配,那么问题就容易解决了。 classSolution{public:intn,m;intsum[1005],que[1005],bol[1005];vect......
  • 【PR】3D Gaussian Splatting for Real-Time Radiance Field Rendering
    最近开始接触基于深度学习的渲染,记录下阅读过的论文。欢迎交流。 这篇论文的主要作者来自法国Inria(国家信息与自动化研究所)。发表在ACMTransactionsonGraphics。 本文主要介绍了一种使用辐射场(RadianceFieldmethods)进行新视角合成的方法:Gaussiansplatting(也有描述说这种......
  • Android权限警告(not in privapp-permissions whitelist)
    1.现象模块使用了Settings.Global之后,单编模块push到手机里面重启,发现手机卡在开机logo界面,开不了机2.抓取logcat看log打印会发现如下图片中的打印,主要的关键词为Privilegedpermissionsnotinprivapp-permissionswhitelist二.查找源码定位问题(Q的代码)文件路径PermissionM......
  • [Rust] module with public and private methods
    Methods:modsausage_factory{//privatemethodfnget_secret_recipe()->String{String::from("Ginger")}//publicmethodpubfnmake_sausage(){get_secret_recipe();println!("sausage!&qu......
  • Prose 和essay的区别
    “prose”相对于“verse”(韵文)而言,包括诗歌以外的一切非韵文体裁,诸如小说、戏剧、文学批评、传记、政论、演说、日记、书信、游记等等,可见涵盖面过广。至于“essay”,英国学者W.E.威廉斯(W.E.Williams)认为,“英国的‘essay’花色繁多,但几乎没有规则”,“是一般比较短小的不以叙事......
  • springboot2.6开始禁止循环依赖了
    参考文章: https://mp.weixin.qq.com/s?__biz=MzI0MTUwOTgyOQ==&mid=2247497189&idx=1&sn=0f03cdafad9bacef66c64a490b85ff23&scene=21#wechat_redirect使用了SpringBoot2.6及以上版本的,如果要允许循环依赖,可以作如下设置:方案二:允许循环引用此方案更像是绕过问题而非解决问题......