当前位置:网站首页>Prufer序列
Prufer序列
2022-08-01 21:59:00 【ThXe】
Prufer性质
Prufer数列是无根树的一种数列。在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2
1.若编号i在Prufer序列出现cnt次,那么它在的度数为cnt+1
2.n个点无标号无根树的形态有nn-2种
3.n个点有标号无根树形态有:4:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e6 + 50;
typedef long long LL;
LL N, M, Ans = 0, father[MAXN], Prufer[MAXN], du[MAXN];//father数组即题目中的f数组
LL read() {
//快读
LL cnt = 0, flag = 1;
char c = getchar();
while (c < '0' || c>'9') {
if (c == '-') flag = -1; c = getchar(); }
while (c >= '0' && c <= '9') cnt = (cnt << 1) + (cnt << 3) + (c ^ 48), c = getchar();
return flag * cnt;
}
void Tree_to_Prufer() {
for (int i = 1; i <= N - 1; i++) father[i] = read(), du[father[i]]++;//将父节点的度加一
for (int i = 1, now = 1; i <= N - 1; i++, now++) {
while (du[now]) now++;//找到编号最小的叶节点
Prufer[i] = father[now];//加入Prufer序列
while (i < N - 2 && !--du[Prufer[i]] && Prufer[i] < now) Prufer[i + 1] = father[Prufer[i]], i++;//当父亲节点编号较小时,继续将父亲节点加入Prufer序列
}
for (int i = 1; i <= N - 2; i++) Ans ^= i * Prufer[i];//计算权值
}
void Prufer_to_Tree() {
for (int i = 1; i <= N - 2; i++) Prufer[i] = read(), du[Prufer[i]]++;//将父节点的度加一
Prufer[N - 1] = N;//这里需要特别注意一下
for (int i = 1, now = 1; i <= N - 1; i++, now++) {
while (du[now]) now++;//找到编号最小的叶节点
father[now] = Prufer[i];//加入父亲数组
while (i < N - 1 && !--du[Prufer[i]] && Prufer[i] < now) father[Prufer[i]] = Prufer[i + 1], i++;//当父亲节点编号较小时,继续将父亲节点加入父亲数组
}
for (int i = 1; i <= N - 1; i++) Ans ^= i * father[i];//计算权值
}
int main() {
memset(du, 0, sizeof(du));
N = read(); M = read();
if (M == 1) Tree_to_Prufer();
else Prufer_to_Tree();
printf("%lld\n", Ans);
return 0;
}
边栏推荐
- Pagoda application experience
- Advanced Algebra_Proof_The algebraic multiplicity of any eigenvalue of a matrix is greater than or equal to its geometric multiplicity
- 365天挑战LeetCode1000题——Day 046 生成每种字符都是奇数个的字符串 + 两数相加 + 有效的括号
- Flink集群搭建
- 使用分类权重解决数据不平衡的问题
- 线程池分析
- Spark cluster construction
- 还在纠结报表工具的选型么?来看看这个
- groupByKey和reduceBykey的区别
- 越长大越孤单
猜你喜欢
随机推荐
【ASM】字节码操作 MethodWriter
SOM Network 2: Implementation of the Code
Port protocol for WEB penetration
365 days challenge LeetCode1000 questions - Day 046 Generate a string with odd number of each character + add two numbers + valid parentheses
Scala practice questions + answers
使用分类权重解决数据不平衡的问题
C语言必杀技3行代码把运行速度提升4倍
SAP Spartacus NgExpressEngineDecorator 的工作原理
[@synthesize in Objective-C]
ARFoundation Getting Started Tutorial U2-AR Scene Screenshot Screenshot
网络水军第一课:手写自动弹幕
基于php影视资讯网站管理系统获取(php毕业设计)
工程建筑行业数据中台指标分析
[Mobile Web] Mobile terminal adaptation
shell specification and variables
Pagoda application experience
游戏元宇宙发展趋势展望分析
leetcode 204. Count Primes 计数质数 (Easy)
企业公众号文章写作方向:如何写出读者认可的优质内容
User Experience | How to Measure User Experience?