Address
https://www.lydsy.com/JudgeOnline/problem.php?id=4754
Solution
先介绍一下有根树的哈希:
(1)一个节点的树,哈希值为 1 1 。
(2)设
为 u u 的子树的哈希值。先将
的所有子节点按照子树哈希值从小到大排序,取底数 W W 和模数
,设 vi v i 是 u u 的第
个(满足 f[vi] f [ v i ] 是 u u 的所有子节点的
中第 i i 小的),那么可以用树形 DP 求得
:
f[u]=(u的子树大小)×∑i=1u的子节点数f[vi]×Wi−1modP f [ u ] = ( u 的 子 树 大 小 ) × ∑ i = 1 u 的 子 节 点 数 f [ v i ] × W i − 1 mod P
树哈希有一个重要应用:判断两棵树是否同构。
两棵无根树同构的概念:两棵无根树同构,当且仅当将其中一棵树的节点编号重排之后,所有的边能够与另一棵树所有的边一一对应。同样地,我们也能引入有根树同构的概念:将一棵树的节点编号重排,如果根节点 u u 的编号变成了 ,另一棵树的根为 v v ,那么这两棵有根树同构,当且仅当重排后第一棵树在以 为根时各个点的父子关系与第二颗树在以 v v 为根时各个点的父子关系相同。
判断同构方法:
两棵无根树同构,当且仅当存在第一棵树的节点 和第二棵树的节点 v v 满足第一棵树以 为根的哈希值和第二棵树以 v v 为根的哈希值相等,即第一棵树以 为根和第二棵树以