当前位置: 首页 > news >正文

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 个节点&#xff0c;编号 1∼n。 为了更加简单明了的描述无根树的结构&#xff0c;我们不妨在输入和输出时将该无根树描述为一个以 n 号节点为根的有根树。 这样就可以设这棵无…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)

显示一段文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…...

开源大数据集群部署(十五)Zookeeper集群部署

作者&#xff1a;櫰木 1、集群规划 主机版本角色系统用户hd1.dtstack.com3.7.1followerzookeeperhd2.dtstack.com3.7.1leaderzookeeperhd3.dtstack.com3.7.1followerzookeeper 2、zookeeper kerberos主体创建 在生产中zk服务端和客户端票据可以设置成不通名称或相同名称&am…...

服务器镜像是什么

镜像即镜像服务器。镜像服务器与主服务器的服务内容都是一样的&#xff0c;只是放在一个不同的地方&#xff0c;分担主服务器的负载量。 可以使用&#xff0c;但不是原版的。在网上内容完全相同而且同步更新的两个或多个服务器&#xff0c;除主服务器外&#xff0c;其余的都被称…...

JWT原理

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

操作系统:一款纯正的“管理”软件

目录 前言&#xff1a; 1.操作系统的概念 2.操作系统的结构示意图&#xff1a; 3.什么是接口&#xff1f; 4.什么是驱动程序&#xff1f; 4.什么是系统调用&#xff08;system call&#xff09;&#xff1f; 5.操作系统和操作系统内核的区别 6.设计OS的核心目的 前言&…...

Mac笔记本聚焦SpotLight占用内存太高的 解法

分享一个自创的绝对有效的解决苹果电脑Mac笔记本SpotLight聚焦占用内存过高的方法! 一、背景 / 问题原因 1、Mac的聚焦功能,可以快速打开应用程序,非常方便! But,随着电脑的使用文件等越来越多,就会导致SpotLight聚焦需要更多更多甚至巨多的内存来建立索引,就会导致电脑…...

C++中.h和.hpp文件有什么区别?

在C中&#xff0c;.h和.hpp文件都是用于包含函数声明、类定义、宏定义等内容的头文件&#xff0c;它们的主要区别在于约定和习惯。 历史与来源&#xff1a;.h后缀是C语言头文件的标准后缀&#xff0c;随着C的演变&#xff0c;一些开发者开始使用.hpp后缀来表示C头文件&#xff…...

MongoDB聚合运算符:$derivative

$derivative聚合运算符返回返回指定窗口内的平均变化率&#xff08;即求导&#xff09;&#xff0c;变化率使用以下公式计算&#xff1a; $setWindowFields阶段窗口中的第一个和最后一个文件。分子&#xff0c;等于最后一个文档的表达式的值减去第一个文档表达式的值。分母&am…...

面试官:如果你现在有20个Spring Boot微服务,如何监视所有这些Spring Boot微服务?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:如果你现在有20个Spring Boot微服务,如何监视这些微服务? 要监视所有 Spring Boot 微服务,可以使用 Spring Boot Admin 这样的监控工具。Sprin…...

冯诺依曼模型

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

高低拖延个体的任务决策及执行差异

高低拖延个体的任务决策及执行差异 摘要 拖延行为普遍存在&#xff0c;且影响着许多人的工作.学习和生活。已有的许多研究发现拖延个体明知自己需要尽快完成某项任务,但行动上却迟迟无法付诸实践&#xff0c;表现出一种知行不- -”的倾向.这种倾向是否在高低拖延特质者之间存…...

数据分析Pandas专栏---第十三章<Pandas训练题(初)>

前言: 写这篇是为了弄一个富有挑战性的Pandas练习题库&#xff0c;涵盖了许多常见和实用的数据处理问题。通过解决这些练习&#xff0c;能够深入了解Pandas提供的关键功能&#xff0c;掌握有效处理数据的技巧和方法。 练习题库涵盖了选择特定列并创建新DataFrame、对DataFrame进…...

Delete `␍`eslint(prettier/prettier) 错误的解决方案

最近开始一个新的项目&#xff0c;由他人构建&#xff0c;clone下来后&#xff0c;发现页面每行都有黄色的波浪线的提示&#xff1a;Delete ␍eslint(prettier/prettier) &#xff0c;尝试了很多方法不能解决&#xff0c;最后选择关闭Prettier&#xff1a; 在.eslintrc.js文件…...

第3周 Python字典、集合刷题

第3周 Python字典、集合刷题 单击题目&#xff0c;直接跳转到页面刷题&#xff0c;一周后公布答案。 B2125&#xff1a;最高分数的学生姓名28&#xff1a;返回字典的键值75&#xff1a;字符串转字典77&#xff1a;映射字符串中的字母87&#xff1a;按条件过滤字典B3632&#…...

文字校对的首选——爱校对:用户真实反馈汇编

在今日快节奏、高标准的工作环境下&#xff0c;准确与效率成为了每位专业人士追求的双重目标。不论是在政府机构、学术领域、企业界&#xff0c;还是在自由职业者的行列中&#xff0c;我们都面临着同一个挑战&#xff1a;如何在保持工作速度的同时&#xff0c;确保每一份文档的…...

Llama-3即将发布:Meta公布其庞大的AI算力集群

Meta&#xff0c;这家全球科技巨头&#xff0c;再次以其在人工智能&#xff08;AI&#xff09;领域的雄心壮志震惊了世界。3月13日&#xff0c;公司在其官方网站上宣布了两个全新的24K H100 GPU集群&#xff0c;这些集群专为训练其大型模型Llama-3而设计&#xff0c;总计拥有高…...

【JAVA】Date、LocalDate、LocalDateTime 详解,实践应用

Date、LocalDate、LocalDateTime 详解&#xff0c;实践应用 一、Date、LocalDate 简介1、 java.util.Date&#xff1a;2、 java.time.LocalDateTime&#xff1a;3、 java.time.LocalDate&#xff1a; 二、输出格式1、使用 java.util.Date 的示例代码如下&#xff1a;2、使用 ja…...

分布式链路追踪(一)SkyWalking(1)介绍与安装

一、介绍 1、简介&#xff1a; 2、组成 以6.5.0为例&#xff0c;该版本下Skywalking主要分为oap、webapp和agent三部分&#xff0c;oap和webapp分别用于汇总数据和展示&#xff0c;这两块共同组成了Skywalking的平台&#xff1b;agent是探针&#xff0c;部署在需要收集数据的…...

蓝桥杯历年真题省赛之 2016年 第七届 生日蜡烛

一、题目 生日蜡烛 某君从某年开始每年都举办一次生日party&#xff0c;并且每次都要吹熄与年龄相同根数的蜡烛。 现在算起来&#xff0c;他一共吹熄了236根蜡烛。 请问&#xff0c;他从多少岁开始过生日party的&#xff1f; 请填写他开始过生日party的年龄数。 注意&…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...