洛谷 P5043 树的同构 题解
本题的难度其实不及紫题的难度。主要是在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 ;
}
洛谷 P5043 树的同构 题解的更多相关文章
- 洛谷 P1268 树的重量 题解
题面 目的:求出树的各边长度 条件:每个节点之间最短路.整个图中不存在负边 我们可以每一次把一个点加入树内,求出这个点和已经构建好的树的边的长度: 这个长度抽象理解一下就是(dis[i][j]+dis ...
- 洛谷 P3384树链剖分 题解
题面 挺好的一道树剖模板: 首先要学会最模板的树剖: 然后这道题要注意几个细节: 初始化时,seg[0]=1,seg[root]=1,top[root]=root,rev[1]=root; 在线段树上 ...
- 洛谷 P3368 树状数组 题解
题面 本题随便看两眼就知道该题满足了优美的查分性质: 对于在区间[x,y]内操作时,应该将查分数组的第x项和第y+1项进行相反操作: 询问答案时,问第i个数的值就是查分数组的前i项和: 暴力+玄学卡常 ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
随机推荐
- maven项目创建4 dao层整合
项目配置文件要放在打包成war包的web项目中 创建文件步骤 1 SqlMapConfig.xml <?xml version="1.0" encoding=" ...
- ueditor+实现word图片自动上传
最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...
- PDFtk:PDF文件处理
造冰箱的大熊猫@cnblogs 2018/9/12 使用PDFtk很多年了,今天得空把相关内容整理总结一下. 1.PDFtk能干什么 - 是否想把两个PDF文档合并到一起 - 是否想从PDF文档中摘出 ...
- 文件操作:fopen()
r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在. rb+ 读写打开一个二进制文件,只允许读写数据. rt+ 读写打开一个文本文件,允许读和写. w 打开只写文件, ...
- 在线PDU格式编码/解码
在线PDU格式编码/解码 使用GSM/GPRS AT指令发送中文短信,汉字时,需要先将短信内容编码成PDU格式,然后通过AT+CMGS AT+CMGW等指令发送. 注意:需要先通过AT+CMG ...
- Java并发编程之java.util.concurrent包下常见类的使用
一,Condition 一个场景,两个线程数数,同时启动两个线程,线程A数1.2.3,然后线程B数4.5.6,最后线程A数7.8.9,程序结束,这涉及到线程之间的通信. public class Co ...
- 【转】Java操作CSV文件导入导出
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 【编程漫谈】Hello world!
Hello world!是打开编程世界的第一把钥匙,只要你能运行出Hello world!,基本上就算入了个门了,因为程序正确的运行代表着基本开发环境都有了,包括编辑器,编译器,解释器,运行环境等待, ...
- SAP MaxDB Backup and Restore
Back up the data and redo log entries from the data and log areas of your database to data carriers ...
- Android 获取视频照片与刷新媒体库
1.获取本地所有视频 public void getLoadMedia() { Cursor cursor = UILApplication.instance.getApplicationContex ...