2419. prufer序列(prufer编码,模板题)
活动 - AcWing
本题需要你实现prufer序列与无根树之间的相互转化。
假设本题涉及的无根树共有 n 个节点,编号 1∼n。
为了更加简单明了的描述无根树的结构,我们不妨在输入和输出时将该无根树描述为一个以 n 号节点为根的有根树。
这样就可以设这棵无根树的父亲序列为 f1,f2,…,fn−1,其中 fi 表示将该树看作以 n 号节点为根的有根树时,i 号节点的父节点编号。
同时,设这棵无根树的prufer序列为 p1,p2,…,pn−2。
现在,给定一棵由 n 个节点构成的无根树,以及该无根树的一个序列(父亲序列或prufer序列),请你求出另一个序列。
输入格式
输入共两行。
第一行包含两个整数 n,m,表示无根树的节点数以及给定序列类型。
如果 m=1,则第二行包含 n−1 个整数,表示给定序列为父亲序列。
如果 m=2,则第二行包含 n−2 个整数,表示给定序列为prufer序列。
输出格式
共一行,输出另一个序列,整数之间用单个空格隔开。
数据范围
2≤n≤10^5
输入样例1:
6 1
3 5 4 5 6
输出样例1:
3 5 4 5
输入样例2:
6 2
3 5 4 5
输出样例2:
3 5 4 5 6
解析:
prufer编码主要作用即将一棵无根树转化为一个序列(即prufer序列),另外prufer序列也可以反过来转化为一棵树,即prufer序列和树之间是一一对应的,常用来解决一些证明问题,如凯莱定理等
证明凯莱定理(一个无向完全图有 n^(n−2) 棵生成树):由于prufer序列和树之间是一一对应的关系,证明有多少棵不同的生成树即证明有多少种prufer序列,显然,prufer序列共有 n−2 项,其范围为 1∼n,故其种类数为 n^(n−2)
prufer编码的流程:假定 n 号节点为根,找到除根外度数最小的节点,在删除该节点之前,将其父节点输出,重复该流程,直到最后只剩下两个节点,即prufer序列只有 n−2 个元素,因为prufer序列最多 n−1 个元素,而最后一个元素一定为 n,所以这个元素可以省略,输出的元素即为prufer序列
如何将一棵树线性时间内转化为prufer序列?
假定当前出度为 0 且编号最小的节点为 j,则输出 f[j],删除 j 之后,出度为 0 的节点至多只会增加一个,即 f[j],判断删除 j 之后 f[j] 的出度是否为 0,如果 f[j] 的出度为 0 且 f[j]<j 说明 f[j] 是当前出度为 0 且编号最小的节点,递归输出这样的父节点即可,否则说明这样的 j 只会更大,即 j 只会增加,这样即可线性时间内将一颗树转化为prufer序列
如何将一个prufer序列转化为一棵树?
先将 n 这个节点加入到prufer序列中,不难发现,prufer序列中某个数出现的次数即为该数在树中的儿子节点的数量,从 1 开始找到儿子数量为 0 且编号最小的节点 j,其父节点即为当前遍历的prufer序列的元素,将该元素从prufer序列中删去,因为删除该元素后儿子数量为 0 的节点数量至多直接增加一个,如果该元素的儿子数量为 0 且编号小于 j,说明当前节点即为儿子数量为 0 且编号最小的节点,递归处理即可,这样的 j 同样也是递增的,故可以在线性时间内将一个prufer序列转化为一棵树
时间复杂度:O(n)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
const int N = 1e5 + 10, M = 1e4 + 10;
const double INF = 1e8;
int n, m;
int f[N], d[N], p[N];void tree2prufer() {for (int i = 1; i < n; i++) {scanf("%d", &f[i]);d[f[i]]++;}for (int i = 1, j = 1; i < n - 1; j++) {while (d[j])j++;p[i++] = f[j];while (i < n - 1 && --d [p[i-1]] == 0 && p[i - 1] < j)p[i++] = f[p[i - 1]];}for (int i = 1; i < n-1; i++) {printf("%d ", p[i]);}
}void prufer2tree() {for (int i = 1; i <= n-2; i++) {scanf("%d", &p[i]);d[p[i]]++;}p[n - 1] = n;for (int i = 1, j = 1; i < n; j++, i++) {while (d[j])j++;f[j] = p[i];while (i < n && --d[p[i]] == 0 && p[i] < j)f[p[i]] = p[i + 1], i++;}for (int i = 1; i < n; i++) {printf("%d ", f[i]);}
}int main() {cin >> n >> m;if (m == 1)tree2prufer();else prufer2tree();return 0;
}
相关文章:
2419. prufer序列(prufer编码,模板题)
活动 - AcWing 本题需要你实现prufer序列与无根树之间的相互转化。 假设本题涉及的无根树共有 n 个节点,编号 1∼n。 为了更加简单明了的描述无根树的结构,我们不妨在输入和输出时将该无根树描述为一个以 n 号节点为根的有根树。 这样就可以设这棵无…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)
显示一段文本的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…...

开源大数据集群部署(十五)Zookeeper集群部署
作者:櫰木 1、集群规划 主机版本角色系统用户hd1.dtstack.com3.7.1followerzookeeperhd2.dtstack.com3.7.1leaderzookeeperhd3.dtstack.com3.7.1followerzookeeper 2、zookeeper kerberos主体创建 在生产中zk服务端和客户端票据可以设置成不通名称或相同名称&am…...
服务器镜像是什么
镜像即镜像服务器。镜像服务器与主服务器的服务内容都是一样的,只是放在一个不同的地方,分担主服务器的负载量。 可以使用,但不是原版的。在网上内容完全相同而且同步更新的两个或多个服务器,除主服务器外,其余的都被称…...

JWT原理
JWT 介绍 JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种简洁的、自包含的方法用于通信双方之间以 JSON 对象的形式安全地传输信息。这种信息可以被验证和信任,因为它是数字签名的。JWT通常用于…...

操作系统:一款纯正的“管理”软件
目录 前言: 1.操作系统的概念 2.操作系统的结构示意图: 3.什么是接口? 4.什么是驱动程序? 4.什么是系统调用(system call)? 5.操作系统和操作系统内核的区别 6.设计OS的核心目的 前言&…...
Mac笔记本聚焦SpotLight占用内存太高的 解法
分享一个自创的绝对有效的解决苹果电脑Mac笔记本SpotLight聚焦占用内存过高的方法! 一、背景 / 问题原因 1、Mac的聚焦功能,可以快速打开应用程序,非常方便! But,随着电脑的使用文件等越来越多,就会导致SpotLight聚焦需要更多更多甚至巨多的内存来建立索引,就会导致电脑…...
C++中.h和.hpp文件有什么区别?
在C中,.h和.hpp文件都是用于包含函数声明、类定义、宏定义等内容的头文件,它们的主要区别在于约定和习惯。 历史与来源:.h后缀是C语言头文件的标准后缀,随着C的演变,一些开发者开始使用.hpp后缀来表示C头文件ÿ…...
MongoDB聚合运算符:$derivative
$derivative聚合运算符返回返回指定窗口内的平均变化率(即求导),变化率使用以下公式计算: $setWindowFields阶段窗口中的第一个和最后一个文件。分子,等于最后一个文档的表达式的值减去第一个文档表达式的值。分母&am…...
面试官:如果你现在有20个Spring Boot微服务,如何监视所有这些Spring Boot微服务?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:如果你现在有20个Spring Boot微服务,如何监视这些微服务? 要监视所有 Spring Boot 微服务,可以使用 Spring Boot Admin 这样的监控工具。Sprin…...

冯诺依曼模型
只要我们学习计算机操作系统,就离不开对冯诺依曼体系结构。因为我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 1.什么是冯诺依曼模型呢? 如上图所示,冯诺依曼模型由…...

高低拖延个体的任务决策及执行差异
高低拖延个体的任务决策及执行差异 摘要 拖延行为普遍存在,且影响着许多人的工作.学习和生活。已有的许多研究发现拖延个体明知自己需要尽快完成某项任务,但行动上却迟迟无法付诸实践,表现出一种知行不- -”的倾向.这种倾向是否在高低拖延特质者之间存…...
数据分析Pandas专栏---第十三章<Pandas训练题(初)>
前言: 写这篇是为了弄一个富有挑战性的Pandas练习题库,涵盖了许多常见和实用的数据处理问题。通过解决这些练习,能够深入了解Pandas提供的关键功能,掌握有效处理数据的技巧和方法。 练习题库涵盖了选择特定列并创建新DataFrame、对DataFrame进…...
Delete `␍`eslint(prettier/prettier) 错误的解决方案
最近开始一个新的项目,由他人构建,clone下来后,发现页面每行都有黄色的波浪线的提示:Delete ␍eslint(prettier/prettier) ,尝试了很多方法不能解决,最后选择关闭Prettier: 在.eslintrc.js文件…...
第3周 Python字典、集合刷题
第3周 Python字典、集合刷题 单击题目,直接跳转到页面刷题,一周后公布答案。 B2125:最高分数的学生姓名28:返回字典的键值75:字符串转字典77:映射字符串中的字母87:按条件过滤字典B3632&#…...

文字校对的首选——爱校对:用户真实反馈汇编
在今日快节奏、高标准的工作环境下,准确与效率成为了每位专业人士追求的双重目标。不论是在政府机构、学术领域、企业界,还是在自由职业者的行列中,我们都面临着同一个挑战:如何在保持工作速度的同时,确保每一份文档的…...
Llama-3即将发布:Meta公布其庞大的AI算力集群
Meta,这家全球科技巨头,再次以其在人工智能(AI)领域的雄心壮志震惊了世界。3月13日,公司在其官方网站上宣布了两个全新的24K H100 GPU集群,这些集群专为训练其大型模型Llama-3而设计,总计拥有高…...
【JAVA】Date、LocalDate、LocalDateTime 详解,实践应用
Date、LocalDate、LocalDateTime 详解,实践应用 一、Date、LocalDate 简介1、 java.util.Date:2、 java.time.LocalDateTime:3、 java.time.LocalDate: 二、输出格式1、使用 java.util.Date 的示例代码如下:2、使用 ja…...

分布式链路追踪(一)SkyWalking(1)介绍与安装
一、介绍 1、简介: 2、组成 以6.5.0为例,该版本下Skywalking主要分为oap、webapp和agent三部分,oap和webapp分别用于汇总数据和展示,这两块共同组成了Skywalking的平台;agent是探针,部署在需要收集数据的…...
蓝桥杯历年真题省赛之 2016年 第七届 生日蜡烛
一、题目 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。 现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。 注意&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...