同构数怎么判断_哈希算法在判定树同构方面的应用(下)

哈希算法在判定树同构方面的应用

在上一篇文章中我们介绍了 枚举根节点哈希求重心哈希 两种方法来判断两棵无根树是否同构。

但是如果有些题目中我必须要计算出每个根节点的 值,且 ,我们要怎么办呢?

考虑以下问题。

(一):洛谷--P4323 [JSOI2016]独特的树叶

82c3c74b979b61cf24b03fad164ef97d.png
在这里插入图片描述

题解:考虑如下解法。

我们求解 树中,以每一点  为根的 值并保存。

我们枚举 树中的叶子节点,计算删去这个叶子节点后,这个叶子节点的父亲的 值,即计算 当前叶子。

如果在 树的 中存在一个值与 当前叶子 相等,那就说明对于 树中以某一点 为根的 ,在 树中能找到一点 ,使得以 为根的 。那么 树与 树同构,当前叶子节点符合要求。

当前问题的关键点转化为怎么快速求出,无根树中,以任意一点 为根的

我们将当前无根树转化为根节点为 的有根树。

对根节点 进行求解,得到  ,此时各点 表示整棵树以 为根,且当前为 节点 子树的哈希值。

我们设一个辅助数组 ,表示整棵树以 为根的哈希值,初始时。

假设 ,且当前 已求出,考虑怎么求解 。

我们已经求出 ,我们要得到以 为根的哈希值。

(以 为根的树中,子树 的哈希值)。

其中 ( 以 为根的树中,子树 的哈希值 ) 等于 。

为以 为根时, 子树的大小。

其中 为这棵树的大小。

即  ,那么我们再进行一遍 即可以求出 。  为以 为根的哈希值。

回到本题:(1)求解 A 树的 并保存至 中。(2)求解 B 树的 (3)枚举叶子节点,检查去掉叶子节点后  树与 树是否同构。

空间复杂度 ,时间复杂度 ,  是因为维护了 。

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define llu unsigned ll
#define pr make_pair
#define pb push_back
#define lc (cnt<<1)
#define rc (cnt<<1|1)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e15;
const int mod=1e9+7;
const int maxn=1000100;
int head[maxn],ver[maxn],nt[maxn],d[maxn];
int fa[maxn],si[maxn],tot=1,n;
llu g[maxn],f[maxn];
int p[maxn<<1],cnt=0;
bool ha[maxn<<1];
set se;//素数筛,可以先打表看一下,素数筛的上界void prime(void){
    ha[1]=true;for(int i=2;i1);i++)
    { if(!ha[i]) p[++cnt]=i;for(int j=1;j<=cnt&&i*p[j]1);j++)
        {
            ha[i*p[j]]=true;if(i%p[j]==0) break;
        }
    }
}//初始化存图void init(void){ memset(head,0,sizeof(head));
    tot=1;
    n++;
}void add(int x,int y){
    ver[++tot]=y,nt[tot]=head[x],head[x]=tot;
}//处理f[x]void dfs1(int x,int ff){
    f[x]=si[x]=1;for(int i=head[x]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值