【学习笔记】Prufer序列

Prufer序列

起源于对 C a y l e y Cayley Cayley定理的证明,但是其功能远不止于此
现在考虑将一棵n个节点的树与一个长度为n-2的prufer序列构造对应关系

  • T r e e − > P r u f e r : Tree->Prufer: Tree>Prufer:

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

    ②删去该叶子节点。

    ③重复①和②,直到树只剩下两个节点,此时序列的长度刚好为 n−2 。

  • P r u f e r — > T r e e : Prufer—>Tree: Prufer>Tree:

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

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

    ③将 i 加一,然后重复①和②,直到序列的每一个元素都使用完毕。

ll p[N];
ll d[N];//度数
ll f[N];//连边
ll ans=0;
void Prufer_To_Tree(ll n)
{//f记录1-n-1的连边情况for(int i=1;i<=n-2;++i) cin>>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];//把最小的叶往prufer序列第一个点上接 对应减掉度数while(i<n&&!--d[p[i]]&&p[i]<j) f[p[i]]=p[i+1],i++;//如果序列第一个点减掉度数后产生了新的更小的叶 就往序列下一个点上接}for(int i=1;i<=n;++i) ans^=1ll*i*f[i];
}
void Tree_To_Prufer(ll n)
{for(int i=1;i<n;++i) cin>>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&&!--d[p[i]]&&p[i]<j) p[i+1]=f[p[i]],i++;}for(int i=1;i<=n-2;++i) ans^=1ll*i*p[i];
}

由此我们发现两者是一一对应的,也就是双射,所以大小为n的有标号无根树的个数等于长度为 n − 2 n-2 n2的prufer序列的个数,自然为 n n − 2 n^{n-2} nn2 C a y l e y Cayley Cayley定理得证

Prufer序列的性质

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

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

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

应用

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

n n − 2 n^{n−2} nn2

2、 n 个点的无根树计数:

同上问题。

3、 n 个点的有根树计数:

对每棵无根树来说,每个点都可能是根,故总数为 n n − 2 × n = n n − 1 n^{n−2}×n=n^{n−1} nn2×n=nn1

4、 n 个点,每点度分别为 d i d_i di 的无根树计数:

显然就是一个多重集,答案为 ( n − 2 ) ! ∏ i = 1 n d i − 1 \frac{(n-2)!}{\prod_{i=1}^{n}d_i-1} i=1ndi1(n2)!

5、 有标号的完全二分图 K n , m K_{n,m} Kn,m的生成树个数为 n m − 1 m n − 1 n^{m-1}m^{n-1} nm1mn1:

考虑将其生成树的prufer序列按照原本顺序分成 f i ≤ n , f i > n f_i\leq n,f_i>n fin,fi>n两部分。

对于 f i ≤ n f_i\leq n fin的部分,一定是删去某个标号 > n >n >n的点之后留下 f i f_i fi的,因为这是一张二分图。所以该部分的点一定恰好有 m − 1 m-1 m1个(右部有m个点,整张图删完之后一定在左右部各留下一个点,所以右部一共要删去 m − 1 m-1 m1个点)

f i > n f_i>n fi>n部分同理。

所以此时还是可以用一个prufer序列与合法生成树对应,故方案数为 n m − 1 m n − 1 n^{m-1}m^{n-1} nm1mn1

Tips:

一般要特判n=1的情况

例题

Valuable Forests

大意:

定义一个树的权值为其所有节点的度数的平方和,森林的权值为所有树的权值和。求大小为n的所有有标号森林的权值和

思路:

f i f_i fi表示大小为i的所有有标号森林的权值和,也就是答案

考虑对于最后一个点所在的树的大小为k的情况

f n = ∑ k = 1 n ( n − 1 k − 1 ) f n − k m k + ( n − 1 k − 1 ) g k h n − k f_n=\sum_{k=1}^{n}\binom{n-1}{k-1}f_{n-k}m_k+\binom{n-1}{k-1}g_kh_{n-k} fn=k=1n(k1n1)fnkmk+(k1n1)gkhnk

其中 m i m_i mi表示大小为 i i i的有标号无根树的个数, g i g_i gi表示大小为 i i i的所有有标号无根树的权值和, h n − k h_{n-k} hnk表示大小为 n − k n-k nk的森林的数量。 ( n − 1 k − 1 ) \binom{n-1}{k-1} (k1n1)是因为枚举的k的含义是n所在树的大小,我要从剩下 n − 1 n-1 n1个点里面选 k − 1 k-1 k1个点。如果不这样枚举的树的组合就会算重。

m n m_n mn很简单: n = 1 n=1 n=1 m 1 = 1 m_1=1 m1=1,否则 m n = n n − 2 m_n=n^{n-2} mn=nn2

对于 g n g_n gn,我们枚举所有度数为i的贡献

转化到prufer序列中看这个问题,度数为i,表示出现了 i − 1 i-1 i1次,所以强制选定对应的数字以及位置,剩下的 n − 1 n-1 n1个数随便放

g n = ∑ i = 1 n − 1 i 2 n ( n − 2 i − 1 ) n − 1 n − 1 − i g_n=\sum_{i=1}^{n-1}i^2n\binom{n-2}{i-1}{n-1}^{n-1-i} gn=i=1n1i2n(i1n2)n1n1i

h n h_n hn的更新思路和 f f f差不多,枚举最后一个点所在的树的大小即可

h n = ∑ i = 1 n ( n − 1 i − 1 ) h n − i m i h_n=\sum_{i=1}^{n}\binom{n-1}{i-1}h_{n-i}m_i hn=i=1n(i1n1)hnimi

cf 156D

大意:

给定n个点以及m条连边,记最少添加T条边使得整张图连通,问有多少种恰好添加T条边的方案使得图连通

思路:

记当前连通块个数为k,则T=k-1

对于每一个连通块,其大小为 a i a_i ai,如果其度数为 d i d_i di的话,我们可以在以连通块为单位的情况下得到生成树个数为 ( k − 2 d 1 − 1 , d 2 − 1... d k − 1 ) \binom{k-2}{d1-1,d2-1...d_k-1} (d11,d21...dk1k2)

对于每一个连通块,固定连边的标号顺序(比如第1条边来自标号最小的连通块,依次类推),那么此时总方案数为 ( k − 2 d 1 − 1 , d 2 − 1... d k − 1 ) ∗ ∏ i = 1 k a i d i \binom{k-2}{d1-1,d2-1...d_k-1}*\prod_{i=1}^{k}a_i^{d_i} (d11,d21...dk1k2)i=1kaidi,因为每一条边都可以有 a i a_i ai种选择

所以答案为 ∑ ∑ d i = k − 2 ( k − 2 d 1 , d 2... d k ) ∗ ∏ i = 1 k a i d i + 1 = ∑ ∑ d i = k − 2 ( k − 2 ) ! ∏ i = 1 k d i ! ∗ ∏ i = 1 k a i d i + 1 \sum_{\sum d_i=k-2}\binom{k-2}{d1,d2...d_k}*\prod_{i=1}^{k}a_i^{d_i+1}=\sum_{\sum d_i=k-2}\frac{(k-2)!}{\prod_{i=1}^{k} d_i!}*\prod_{i=1}^{k}a_i^{d_i+1} di=k2(d1,d2...dkk2)i=1kaidi+1=di=k2i=1kdi!(k2)!i=1kaidi+1
= ( k − 2 ) ! ∏ i = 1 k a i ( ∑ ∑ i = 1 k d i = k − 2 ∏ i = 1 k a i d i d i ! ) =(k-2)!\prod_{i=1}^{k} a_i(\sum_{\sum_{i=1}^{k} d_i=k-2}\prod_{i=1}^{k}\frac{a_i^{d_i}}{d_i!}) =(k2)!i=1kai(i=1kdi=k2i=1kdi!aidi)

注意到 ( k − 2 ) ! ∏ i = 1 k a i (k-2)!\prod_{i=1}^{k} a_i (k2)!i=1kai是一个常数,我们只用看后面

记生成函数 f x = ∑ i = 0 inf ⁡ x i i ! = e x f_x=\sum_{i=0}^{\inf}\frac{x_i}{i!}=e^x fx=i=0infi!xi=ex

不难发现后面其实是k个函数 f a i f_{a_i} fai的卷积的某一项,故后面部分的答案为 [ x k − 2 ] ∏ i = 1 k e a i x = [ x k − 2 ] e n x = n k − 2 ( k − 2 ) ! [x^{k-2}]\prod_{i=1}^{k}e^{a_ix}=[x^{k-2}]e^{nx}=\frac{n^{k-2}}{(k-2)!} [xk2]i=1keaix=[xk2]enx=(k2)!nk2

所以最终答案为 n k − 2 ∏ i = 1 k a i n^{k-2}\prod_{i=1}^{k}a_i nk2i=1kai

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cron表达式_用于定时调度任务

一、Cron表达式简介 Cron表达式是一个用于设置计划任务的字符串&#xff0c;该字符串以5或6个空格分隔&#xff0c;分为6或7个域&#xff0c;每一个域代表任务在相应时间、日期或时间间隔执行的规则【Cron表达式最初是在类Unix操作中系统中使用的&#xff0c;但现在已经广泛应用…

人机融合需要在事实与价值之间构建新型的拓扑关系

人机融合&#xff0c;这是指将人类智慧&#xff08;含艺术&#xff09;与计算机科技相结合&#xff0c;共同解决复杂问题的一种新方式。在人机融合中&#xff0c;我们需要构建事实与价值之间的新型拓扑关系&#xff0c;以实现更有效的知识管理和决策支持。 事实是指客观存在的、…

Python爬虫爬取豆瓣电影短评(爬虫入门,Scrapy框架,Xpath解析网站,jieba分词)

声明&#xff1a;以下内容仅供学习参考&#xff0c;禁止用于任何商业用途 很久之前就想学爬虫了&#xff0c;但是一直没机会&#xff0c;这次终于有机会了 主要参考了《疯狂python讲义》的最后一章 首先安装Scrapy&#xff1a; pip install scrapy 然后创建爬虫项目&#…

EdgeMoE: Fast On-Device Inference of MoE-based Large Language Models

本文是LLM系列文章&#xff0c;针对《EdgeMoE: Fast On-Device Inference of MoE-based Large Language Models》的翻译。 EdgeMoE&#xff1a;基于MoE的大型语言模型的快速设备推理 摘要1 引言2 实验与分析3 EDGEMOE设计4 评估5 相关工作6 结论 摘要 GPT和LLaMa等大型语言模…

力扣26:删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 …

关于业务库从MySQL迁移到DM8的操作指南

升级前准备 jdbc:dm://10.252.10.15:5237 username: datashare password: datashare123 把当前MySQL数据库下的数据库表以及数据迁移到DM8。通过达梦8自带的工具可以实现迁移&#xff08;仅支持Win&#xff09; DM8管理工具下载&#xff1a;https://www.dameng.com/DM8.html…

Leetcode 95. 不同的二叉搜索树 II

文章目录 题目代码&#xff08;9.21 首刷看解析&#xff09; 题目 Leetcode 95. 不同的二叉搜索树 II 代码&#xff08;9.21 首刷看解析&#xff09; class Solution { public:vector<TreeNode*> generateTrees(int n) {return build(1,n);}vector<TreeNode*> bu…

将本地前端工程中的npm依赖上传到Nexus

【问题背景】 用Nexus搭建了内网的依赖仓库&#xff0c;需要将前端工程中node_modules中的依赖上传到Nexus上&#xff0c;但是node_modules中的依赖已经是解压后的状态&#xff0c;如果直接机械地将其简单地打包上传到Nexus&#xff0c;那么无法通过npm install下载使用。故有…

Jenkins Job的Migrate之旅

场景 使用Jenkins 做为应用的定时任务处理&#xff0c; 在上面建立的800个左右的Job, 这个环境运行了很多年&#xff0c; 当初安装的最新版本是Jenkins 1.642.3&#xff0c; 现在因为OS需要升级等原因&#xff0c; 驻在上面的Jenkins 服务器也需要一并升级&#xff0c;在新的服…

Mock.js之Element-ui搭建首页导航与左侧菜单

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 1、Mock.js的使用 1.1.什么是Mock.js Mock.js是一个模拟数据的生成器&#xff0c;用来帮助前…

浅谈C++|文件篇

C中的文件操作是通过使用文件流来实现的。文件流提供了对文件的输入和输出功能。下面是C文件操作的基本步骤&#xff1a; 1. 包含头文件&#xff1a;首先&#xff0c;包含 <fstream> 头文件&#xff0c;它包含了进行文件操作所需的类和函数。 2 . 进行文件读写操作&#…

9领域事件

本系列包含以下文章&#xff1a; DDD入门DDD概念大白话战略设计代码工程结构请求处理流程聚合根与资源库实体与值对象应用服务与领域服务领域事件&#xff08;本文&#xff09;CQRS 案例项目介绍 # 既然DDD是“领域”驱动&#xff0c;那么我们便不能抛开业务而只讲技术&…

Windows专业版的Docker下载、安装与启用Kubenetes、访问Kubernetes Dashboard

到Docker 官网https://www.docker.com/ 下载windows操作系统对应的docker软件安装 Docker Desktop Installer-Win.exe 2023-09版本是4.23 下载后双击安装 重启windows后&#xff0c;继续安装 接受服务继续安装 解决碰到的Docker Engine stopped 打开 控制面板》程序》启用或关…

Python 与 Qt c++ 程序共享内存,传递图片

python 代码 这里Python 使用 shared_memory QT 使用 QSharedMemory 简单协议&#xff1a; 前面4个字节是 图片with,height,0,0 后面是图片数据 import sys import struct def is_little_endian():x0x12345678y struct.pack(I,x)return y[0]0x78print(f"is_little_end…

软件测试/测试开发丨利用人工智能ChatGPT自动生成PPT

点此获取更多相关资料 简介 PPT 已经渗透到我们的日常工作中&#xff0c;无论是工作汇报、商务报告、学术演讲、培训材料都常常要求编写一个正式的 PPT&#xff0c;协助完成一次汇报或一次演讲。PPT相比于传统文本的就是有布局、图片、动画效果等&#xff0c;可以给到观众更好…

css有用的小技巧(vue2)

1、希望悬浮的时候&#xff0c;img图标的src改变 <template><div style"padding: 20px"><img src"../static/icon/1.svg"></div> </template> <style scoped>img:hover {content: url(../static/icon/2.svg);} </…

第一百五十四回 如何实现滑动菜单

文章目录 概念介绍实现方法示例代码体验分享 我们在上一章回中介绍了滑动窗口相关的内容相关的内容&#xff0c;本章回中将介绍如何实现 滑动菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的滑动菜单表示屏幕上向左或者向右滑动滑动时弹…

服务器卡顿了该如何处理?

服务器卡顿了该如何处理&#xff1f; 当Windows系统的服务器出现卡顿问题时&#xff0c;以下是一些常见的故障排除步骤&#xff1a; 1.检查网络连接&#xff1a;确保服务器的网络连接正常。检查网络设备、交换机、防火墙等设备&#xff0c;确保它们正常运行。尝试通过其他计算…

自注意力机制

回顾以下注意力机制&#xff1a; 自注意力机制 Self-Attention的关键点 在于 K ≈ \approx ≈V ≈ \approx ≈Q 来源于同一个X&#xff0c;三者是同源的&#xff0c;通过 W Q W_Q WQ​, W K W_K WK​, W V W_V WV​做了一层线性变换。 接下来步骤和注意力机制一模一样。 …

基于微信小程序的线上教育课程付费商城(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…