prufer序列

20min终于战胜

将一颗树变成了长度 \(n-2\) 的序列

将树变成 \(prufer\) 序列

每次找到编号最小的叶子,然后将有连边的那个点加到序列里面。

首先,对于一个不同的树,这个序列肯定不一样,毕竟有两个点父亲都不一样。每次编号最小那么就是不重复。因为每颗无根树都可以映射到一个 \(prufer\) 序列,每个 \(prufer\) 序列也可以映射到一颗无根树。都好理解。

\(prufer\) 序列变成树
先得到每个点的度数,然后挑编号最小的叶子和 \(prufer\) 里面的东西连边。

考虑线性构造。

part 1
用一个指针指到编号最小的叶节点。然后把它的父亲加进序列。然后来个 while 循环,一直跳到父亲大于叶子。然后指针往前跳,跳到第一个叶子,容易证明时间线性和正确性
part 2
用一个指针指到当前编号最小的叶节点,然后和 \(prufer\) 序列里面的连边,然后一个 while 循环,往 \(prufer\) 序列那个数跳,然后还是差不多,容易证明时间线性和正确性

posted @ 2025-07-09 10:20  wuhupai  阅读(23)  评论(0)    收藏  举报