【笔记】Prfer 序列

之前的版本

观前提示:可以用 alt+0252 打出来 ü 这个字符喵

1. 对树建立 Prüfer 序列

\(\rm Def.\) Prüfer 序列的构建如下:
每次选择树中编号最小的叶节点并删去它,并在一个初始为空的序列末加入其连接到的节点,直到整个树剩下 \(2\) 个节点(即 Prüfer序列 的长度为 \(n-1\)

实现

首先可以用堆,这显然是 \({\cal O}(n \log n)\) 的。

不过 Prüfer 序列也可以线性构造,过程:
0. 用一个指针 \(p\) 指向编号最小的叶节点;

  1. 删除 \(p\) 指向的节点;
  2. 如果产生新的叶节点,且编号小于原节点,删除之,并重复本步;
  3. \(p\) 自增,直至指向一个未被删除的叶节点。
    这个算法的正确性是有保证的,因为每次删除的一定是最小的叶节点。第 2 步中产生的新的叶结点中编号大于原节点的一定会在之后被扫描到。
    时间复杂度上,\(p\) 至多自增 \(n-1\) 次,而第二步产生新的叶节点一定会消耗边,一棵树只有 \(n-1\) 条边,故总的时间复杂度是 \({\cal O}(n)\) 的。

2. 性质

  1. 最后剩下俩节点,其中必有 \(n\)
  2. 每个节点 \(v\) 出现 \({\rm deg}(v)-1\) 次。

3. 用 Prüfer 序列重构树

用 Prüfer 序列还原整棵树上节点的度数,找到序号最小的叶节点,prüfer 序列的第一个元素就是它的父节点。之后将它的父节点度数减一,继续之前的过程。

用堆维护,是 \({\cal O}(n \log n)\) 的。

重构也有线性的算法,和 [[Prüfer序列#实现|对树建立 Prüfer 序列的线性算法]] 如出一辙。

4. 代码

P6086 【模板】Prufer 序列

\({\cal O}(n \log n)\) 实现

void PtT() {for(int i = 1;i <= n-2;++i) deg[a[i]]++;for(int i = 1;i <= n;++i) if(deg[i] == 0) q.push(i);for(int i = 1;i <= n-2;++i) {b[q.top()] = a[i];q.pop();if(--deg[a[i]] == 0) q.push(a[i]);}for(int i = 1;i <= n-1;++i) {if(b[i] == 0) b[i] = n;ans ^= 1ll*i*b[i];}
}
void TtP() {for(int i = 1;i < n;++i) {deg[i]++;deg[a[i]]++;}for(int i = 1;i <= n;++i) if(deg[i] == 1) q.push(i);for(int i = 1;i <= n-2;++i) {b[i] = a[q.top()];q.pop();if(--deg[b[i]] == 1) q.push(b[i]);ans ^= 1ll*i*b[i];}
}

傻逼浓缩

int main() {
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= n-m;++i)
        scanf("%d",&a[0][i]);
    if(m == 2)
        a[0][n-1] = n;
    for(int i = 1;i <= n-m;++i)
        deg[a[0][i]]++;
    for(int i = 1;i <= n;++i)
        if(deg[i] == 0)
            q.push(i);
    m--;
    for(int i[2] = {1,0};i[0] < n-(m^1);++i[0]) {
        i[1] = q.top();
        a[1][i[m]] = a[0][i[m^1]];
        ans ^= 1ll*i[m]*a[1][i[m]];
        q.pop()
        if(--deg[a[1][i[m]]] == 0)
            q.push(a[1][i[m]]);
    }
    printf("%lld\n",ans);
    return 0;
}

\({\cal O}(n)\) 实现

void TtP() {for(int i = 1;i < n;++i) deg[a[i]]++;for(int p = 1, i = 0;p < n;++p) {int q = p;while(!deg[q]) {b[++i] = a[q];deg[a[q]]--;if(a[q] > p) break;q = a[q];}}
}
void PtT() {a[n-1] = n;for(int i = 1;i < n;++i) deg[a[i]]++;for(int p = 1, i = 0;p < n;++p) {int q = p;while(!deg[q]) {b[q] = a[++i];deg[b[q]]--;if(b[q] > p) break;q = b[q];}}
}

5. 凯莱公式

由上述 [[Prüfer序列#1. 对树建立 Prüfer 序列|Part 1]] 和 [[Prüfer序列#3. 用 Prüfer 序列重构树|Part 3]],我们得到了一个大小为 \(n\) 的无根树与长为 \(n-2\) 的序列之间的一一对应,所以我们可以证明 Cayley 公式:

\[\text{完全图}\ K_n\ \text{有}\ n^{n-2}\ \text{棵生成树。} \]

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

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

相关文章

win11 无线投屏(Miracast:)引发的思考附带解决方案 - Popeye

这个功能想必大家使用的情况很多,比如平板或手机投屏到电脑上,实现多屏设备的统一管理。 就这个功能自己几次更新后,被系统给屏蔽了,并提示出了红色字体。静止使用。 一般出现这个问题后解决思路有以下几个方向 1.…

2025年十大主流项目管理工具评测:功能覆盖与成本效益分析

2025年项目管理工具市场正经历技术革新与功能升级的关键阶段,企业面临众多选择却难以快速匹配需求。本文从功能覆盖度、团队适配性、成本效益三大核心维度,横向评测禅道、Asana、Trello、Jira、ClickUp、Monday.com、…

关于服装店网站建设的策划方案温州seo公司

前言 在服务器的VMWARE ESXi系统环境中&#xff0c;我们经常需要创建虚拟机来运行各种应用程序。然而&#xff0c;服务器如果偶尔出现自动重启以及紫屏报错的问题&#xff0c;说明服务器内部出现了故障&#xff0c;一般情况下重启机器能够解决问题&#xff0c;但时间一长&…

完整教程:服务器磁盘空间满了怎么办?阿里云ECS清理与云盘扩容教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

航空总医院医院网站建设招标网站全国企业公示网查询官网

目录 1. 数据采集 2. 图像标注 3. 开源已标记数据集 4. 数据集划分 参考&#xff1a; 1. 数据采集 数据采集是深度学习和人工智能任务中至关重要的一步&#xff0c;它为模型提供了必要的训练样本和测试数据。在实际应用中&#xff0c;数据采集的方法多种多样&#xff0c;每…

分布式专题——19 Zookeeper分布式一致性协议ZAB源码剖析 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

关于MCO使用配置

关于MCO,相关介绍如下图: 针对以上8个时钟信号作为MCO时钟输出的配置如下:1、系统时钟输出此时MCO引脚(PA8)输出时钟频率即系统主频的大小GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RC…

网络运维 --- ntp服务器

网络运维 --- ntp服务器在Windows系统中开启NTP服务器功能,主要可以通过以下步骤实现。以下是详细说明:方法一:通过注册表配置(适用于Windows专业版/服务器版)开启NTP服务器功能:按 Win + R 输入 regedit 打开注…

站点和网站的区别南宁网站建设活动

首先&#xff0c;我们需要明确一点&#xff0c;HTTPS证书的价格并不是一成不变的&#xff0c;它受到多种因素的影响。其中最主要的因素包括证书的类型、颁发机构以及所需的验证级别。 从类型上来看&#xff0c;HTTPS证书主要分为单域名证书、多域名证书和通配符证书。单域名证书…

向量那点事儿

目录一、向量坐标表示二、加减法向量加法应用示例向量减法应用示例三、向量内积应用示例四、向量外积应用示例五、小试牛刀代码示例六、小结 一、向量 这次我们继续聊一下向量。 向量可以理解为一个有方向的量。 它既有…

c++输入输出详解

C++ 的输入输出(I/O)主要通过标准库中的流对象实现,核心是对“数据流”的操作。其语法规则围绕“流对象”“操作符”和“数据类型匹配”展开,以下从标准 I/O(控制台) 和文件 I/O 两部分详细说明。 一、标准输入输…

docker/docker compose/k8s

Docker、Docker Compose 和 Kubernetes(K8s)是现代容器化技术的核心组成部分,但它们扮演着不同的角色。 简单来说:Docker:用来创建和运行单个容器的工具。Docker Compose:用来定义和运行多个相互依赖的容器的工具…

中国开发者迎来新选择:Gitee成为研发协作平台转型期的中流砥柱

中国开发者迎来新选择:Gitee成为研发协作平台转型期的中流砥柱 随着腾讯CODING DevOps系列产品宣布逐步停止服务,中国开发者社区正面临一次重要的工具链迁移抉择。在这一行业转折点上,本土化研发协作平台Gitee凭借其…

PySpark - Get the number of rows

PySpark - Get the number of rowsspark is a SparkSession object, what does spark.sql().collect() do? ChatGPT said:Good question 👍 Let’s break it down:spark → a SparkSession object.spark.sql(query)…

如何推销网站建设做网站怎么签订协议

元描述&#xff1a;想要找到下一个 100 倍加密货币投资&#xff1f;请密切关注这篇文章&#xff1b;它揭示了所有可能很快变得非常有价值的 TON 网络宝石。 由 Telegram 提供支持的 TON&#xff08;开放网络&#xff09;生态系统正在蓬勃发展&#xff01;这是一个充满激动人心的…

RK3588-ubuntu server - 详解

RK3588-ubuntu server - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

一文教你上手 Geometric Glovius 6.0:安装、授权与首个项目演示

Geometric Glovius 6.0.0是一款功能强大的3D可视化分析软件。它支持CATIA、NX、Creo等多种主流CAD文件格式,能精确测量距离、面积、体积等数据,还可进行动态截面切割、模型差异对比等操作。用户可通过缩放、旋转等方…

32单片机+free rtos移植CJSON库函数主要流程

1.cJSON库的官方地址 源码地址: https://github.com/DaveGamble/cJSON 2.提取cJSON.c cJSON.h 3.在项目中添加cJSON的路径并编译一遍 4.在main函数初始化时添加下面代码,重定向内存的申请,内存申请定向到rtos的内存池…

Gitee如何重塑中国开发者生态:本土化创新与数字化转型的双重奏

Gitee如何重塑中国开发者生态:本土化创新与数字化转型的双重奏 在数字经济蓬勃发展的今天,代码托管平台已经从单纯的工具演变为开发者生态系统的核心枢纽。作为国内领先的一站式代码托管与协作平台,Gitee凭借对中国…

从MESA模型到锁升级:synchronized性能逆袭的底层逻辑

从MESA模型到锁升级:synchronized性能逆袭的底层逻辑管程(Monitor)是一种用于管理共享资源访问的程序结构,能确保同一时刻只有一个线程访问共享资源,解决并发编程中的互斥和同步问题。MESA模型是管程的经典实现,…