[树哈希] 树的同构

Posted 鱼竿钓鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[树哈希] 树的同构相关的知识,希望对你有一定的参考价值。

[树哈希] 树的同构

题目

题目链接

思路

主要是设计哈希函数
对于无权树,我们设置哈希函数为
h s [ r o o t ] = ∑ h s [ s o n ] ∗ p r i m e [ s i z e [ s o n ] ] hs[root]=\\sum hs[son]*prime[size[son]] hs[root]=hs[son]prime[size[son]]
然后发现以不同的节点作为根,hash值不同,所以我们枚举所有节点作为根求解hash值然后取最小的作为代表即可

虽然是一道紫题,但是数据属实太弱了。应该可以加强一波,考虑对hash函数进行换根转移可以优化很多,下面是没有进行换根的hash

另外,0节点不算在树状结构中

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<utility>
#include<set>
#include<vector>
#include<queue>
#include<stack>
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
#define endl '\\n'
//CHECK MULTIPLY INPUT	!!!
//NEW DATA CLEAN	!!!
//THINK > CODE	!!!
int m,n;
const int N=55,MAXN=1e6+10;
vector<int>root[N];
map<int,int>mp;
int cnt,prime_cnt,rt;
int prime[MAXN],siz[MAXN];
bool st[MAXN];
int get_id(int x,int ord){
	if(mp[x])return mp[x];
	return mp[x]=ord;
}

void get_primes(){
	st[0]=st[1]=1;
	for(int i=2;i<MAXN;i++){
		if(!st[i])prime[++prime_cnt]=i;
		for(int j=1;j<=prime_cnt&&i*prime[j]<MAXN;j++){
			st[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
void get_size(int u,int fa){
	siz[u]=1;
	for(auto to:root[u]){
		if(to!=fa){
			get_size(to,u);
			siz[u]+=siz[to];
		}
	}
}
int get_hash(int u,int fa){
	int hs=1;
	for(auto to:root[u]){
		if(to!=fa){
			int s=get_hash(to,u);
			hs+=s*prime[siz[to]];
		}
	}
	return hs;
}
int main(){
	get_primes();
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>n;
		for(int j=0;j<=n;j++)root[j].clear();
		for(int j=1;j<=n;j++){
			int x;cin>>x;
			if(x==0)rt=j;
			else{
				root[x].push_back(j);
				root[j].push_back(x);
			}
		}
		int hash=1e9+10;
		for(int j=1;j<=n;j++){
			memset(siz,0,sizeof siz);
			get_size(j,0);
			hash=min(hash,get_hash(j,0));
		}
		cout<<get_id(hash,i)<<endl;	
	}
	return 0;
}

以上是关于[树哈希] 树的同构的主要内容,如果未能解决你的问题,请参考以下文章

P5043 模板树同构([BJOI2015]树的同构)

P5043 模板树同构([BJOI2015]树的同构) |树哈希

4337. [BJOI2015]树的同构树哈希

[BJOI2015]树的同构 && 树哈希教程

PTA 数据结构与算法题目集(中文) 7-3 树的同构 (树哈希)

HDU2228栈深搜树哈希/同构