洛谷 P5043 树的同构 题解
2024-10-07 03:20:12
本题的难度其实不及紫题的难度。主要是在hash时的处理细节比较繁琐;
首先是树hash的模板:
long long treehash(int u,int fa)
{
long long q[];
long long num=;
long long ans=;
for(int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==fa) continue;
q[++num]=treehash(v,u);
}
sort(q+,q+num+);
for(int i=;i<=num;i++){
ans=ans*+q[i];
}
return ans*2333+1;
}
对于无根树在数据不多的时候可以依次枚举每个点当根时的根节点的hash值,然后将这些树上hash值变为一组数的hash值;
然后n^2比较每棵树的线性hash值就可以了;
#include <bits/stdc++.h>
using namespace std;
struct littlestar{
int to;
int nxt;
}star[];
long long head[],cnt;
void add(int u,int v)
{
star[++cnt].to=v;
star[cnt].nxt=head[u];
head[u]=cnt;
}
long long myhash[];
long long treehash(int u,int fa)
{
long long q[];
long long num=;
long long ans=;
for(int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==fa) continue;
q[++num]=treehash(v,u);
}
sort(q+,q+num+);
for(int i=;i<=num;i++){
ans=ans*+q[i];
}
return ans*2333+1;
}
long long lala[];
long long ans[];
int main ()
{
int t;
cin>>t;
for(int i=;i<=t;i++){
memset(head,,sizeof(head));
memset(lala,,sizeof(lala));
cnt=;
int n;
cin>>n;
int root=;
for(int j=;j<=n;j++){
int x;
scanf("%d",&x);
if(x==){
root=j;
continue;
}
add(x,j);
add(j,x);
}
for(int j=;j<=n;j++) myhash[j]=treehash(j,);
sort(myhash+,myhash++n);
for(int j=;j<=n;j++) lala[j]=lala[j-]*myhash[j]+;
ans[i]=lala[n];
for(int j=;j<=i;j++){
if(ans[i]==ans[j]){
cout<<j<<endl;
break;
}
}
}
return ;
}
最新文章
- 关于datepicker只显示年、月、日的设置
- async.whilst 的一个简化版实现
- SCRUM报告(1)
- GBDT和RF的区别
- GSM cell phone calls use outdated encryption that can now be cracked with rainbow tables on a PC
- struts2更新版本操作有关事项备注
- C++ ADO 数据查询
- ↗☻【编写可维护的JavaScript #BOOK#】第8章 避免“空比较”
- interactive_timeout和wait_timeout(
- Java的内存泄漏_与C/C++对比(转载总结)
- 在eclipse下编译hadoop2.0源码
- 使用GDB生成coredump文件【转载】
- MyCAT部署及实现读写分离(转)
- postgresql优化数据的批量插入
- RTB撕开黑盒子 Part 4: Shady Bidding
- android 定时器(Handler Timer Thread AlarmManager CountDownTimer)
- bzoj:1700: [Usaco2007 Jan]Problem Solving 解题
- JVM学习(一)
- SRS-开源流媒体服务器
- React 组件