首页 > 其他分享 >树同构

树同构

时间:2024-04-25 13:01:22浏览次数:11  
标签:同构 idx int long 哈希 root operatorname

link

树同构是树哈希与换根 dp 的结合。

树哈希是哈希中的一个种类,这里先给出哈希函数:

\[\operatorname{treehash}(u)=\sum \operatorname{xorshift}(\operatorname{treehash}(v)) \]

这里使用 unsigned long long 的自然溢出特性代替取模。

我们设 \(g[u]\) 是以 \(u\) 为根的子树的 hash 值。

直接使用上式计算即可。

再设 \(f[u]\) 为以 \(u\) 为根的整棵树的 hash 值。

易知:\(f[u]= \operatorname{treehash}(f[fa] - \operatorname{xorshift(g[u])})+g[u]\)

贴个代码:

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;

int rp;

const int N=1e3+10;
int g[N],f[N];
struct edge{
	int v,next;
}edges[N*2];
int head[N],idx;
set<int>s[N];
int n;

void add_edge(int u,int v){
	idx++;
	edges[idx].v=v;
	edges[idx].next=head[u];
	head[u]=idx;
	return;
}

int xor_shift(int x){
	x^=rp;
	x^=x<<13;
	x^=x>>7;
	x^=x<<17;
	x^=rp;
	return x;
}

void init(){
	idx=0;
	for(int i=1;i<=n;i++)head[i]=0;
	return;
}

void get_hash_val(int u,int fa){
	g[u]=1;
	for(int i=head[u];i;i=edges[i].next){
		int v=edges[i].v;
		if(v==fa)continue;
		get_hash_val(v,u);
		g[u]+=xor_shift(g[v]);
	}
	return;
}

void dfs(int u,int fa){
	if(fa==0){
		f[u]=g[u];
	}
	else{
		f[u]=xor_shift(f[fa]-xor_shift(g[u]))+g[u];
	}
	for(int i=head[u];i;i=edges[i].next){
		int v=edges[i].v;
		if(v==fa)continue;
		dfs(v,u);
	}
	return;
}

signed main(){
	std::ios::sync_with_stdio(false);
	srand(time(NULL));
	rp=rand();rp++;
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		cin>>n;
		init();
		int root=0;
		for(int j=1;j<=n;j++){
			int x;
			cin>>x;
			if(x!=0){
				add_edge(x,j);
				add_edge(j,x);
			}
			else root=j;
		}
		assert(root);
		get_hash_val(root,0);
		dfs(root,0);
		int ans=i;
		for(int j=1;j<=n;j++)s[i].insert(f[j]);
		for(int j=1;j<=n;j++){
			for(int k=1;k<t;k++){
				if(s[k].count(f[j])){
					ans=min(k,ans);
				}
			}
		}
		cout<<ans<<endl;
	}
	
	return 0;
}

标签:同构,idx,int,long,哈希,root,operatorname
From: https://www.cnblogs.com/little-corn/p/18157421

相关文章

  • casl 同构授权js 框架
    casl同构授权js框架,提供了web前端以及后端的集成支持(使用相同的api)包含的特性多功能 灵活的基于subject以及属性的授权处理同构 同时支持前端以及后端类型安全 基于ts开发小巧 压缩之后只有6kb声明式的 基于声明式的可以灵活的进行规则的共享,包含了ui,api以及微......
  • 「笔记」树同构
    目录写在前面树同构定义有根树同构无根树同构树哈希有根树无根树AHU算法例题UOJ#763.树哈希SP7826-TREEISO-TreeIsomorphismP5043【模板】树同构([BJOI2015]树的同构)写在最后写在前面vp的时候用到了于是来学一下。好水。抱歉了AHU,但是树哈希它实在是太好写了。树同......
  • 群的同态与同构
    同态(Homomorphism)现在我们能够更深刻地理解“群”到底描述了什么。群描述且仅描述一个给定集合以及定义在该集合上的唯一的一个二元运算。任意给定群里的两个元素,我们总能通过“运算”这一方式确定是群里的哪个元素与这两个元素对应。如果我们抛开群中每个元素的具体名字不看,元......
  • 基于vite多页面实现多端同构开发和部署
    背景由于在开发前端项目中,后台管理端和用户端存在多个模块和页面逻辑可以复用,管理模块和用户端渲染模块使用同一套状态管理机制,只是在管理端和用户端的入口和路由模块不同,为了能够在开发时同时修改管理端和用户端共用模块,不用多项目工程修改和发布,我们基于vite多页面的基础上实现......
  • 同构图和异构图、有向图和无向图的区别?
    同构图和异构图、有向图和无向图是图论中的几个重要概念,它们的主要区别如下:同构图与异构图的区别:同构图指的是两个图结构完全相同,即点数相同、边数相同,且每条对应边连接的顶点也一一对应。形式化定义为:如果存在一个双射f,使得对图G中任意两点u,v,有(u,v)是G......
  • leedcode-同构字符串
    自己写的:classSolution:defisIsomorphic(self,s:str,t:str)->bool:#使用match函数分别检查s到t和t到s的映射关系res_a=self.match(s,t)res_b=self.match(t,s)#如果两个方向的映射关系都成立,则说明......
  • 求所有不同构的最小生成树
    题目用字符文件提供数据建立连通带权无向网络邻接矩阵存储结构。编写程序,求所有不同构的最小生成树。要求输出每棵最小生成树的各条边(用顶点无序偶表示)、最小生成树所有边上的权值之和;输出所有不同构的生成树的数目。省流:并没有解决这个问题,但是学到的求解树重心,求解括号序等思......
  • React前后端如何同构,防止重复渲染
    什么叫前后端同构?为了解决某些问题(比如SEO、提升渲染速度等)react提供了2个方法在服务端生成一个HTML文本格式的字符串。在得到了这个HTML格式的字符串之后,通常会将其组装成一个页面直接返回给用户的浏览器。到这里,服务端的活已经干完了,然后就是浏览器这边干活。浏览器拿到HTML......
  • 《同构JavaScript应用开发》电子书PDF+源代码
    本书将向你展示如何构建和维护属于自己的同构JavaScript应用。全书分为三部分,第一部分描绘不同种类的同构JavaScript的轮廓,第二部分介绍关键概念,第三部分提供业界同行的解决方案案例。通过阅读本书,你将了解到这种应用架构日益流行的原因,并将其运用于解决关键的业务问题,如页面加载速......
  • 怎样写一个公用方法,传的参数是同构的但是类名不一样的实体
    要编写一个通用方法,用于接收类名不同但结构相同的实体作为参数,可以使用Java的泛型来实现。以下是一个示例代码:importcom.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;publicinterfaceGenericMappe......