【bzoj4337】【Bjoi2015】树的同构



题解
- 无标号树的HASH:
- 找到树的重心,以重心为根求出括号序列;
- 由于树的重心最多只有两个,取字典序的最小括号序列HASH即可
- 树的括号序列$s_{u}="(s_{v_{1}},s_{v_{2}},s_{v_{3}},...,s_{v_{n}})"$,同时字典序$s_{v_{1}} <= s_{v_{2}} <= ,... $
- 有标号树的HASH:
- 个人认为可以直接$prufer$序列$HASH$
- 或者直接将儿子排个序$hash$,(总之乱搞)
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
const int N=;
int n,m,hd[N],o,sz[N],mx[N],Mx,tot;
struct Edge{int v,nt;}E[N<<];
map<int,int>h;
string now,s[N],tmp[N];
void adde(int u,int v){
E[o]=(Edge){v,hd[u]};hd[u]=o++;
E[o]=(Edge){u,hd[v]};hd[v]=o++;
}
void get_rt(int u,int fa){
sz[u]=;mx[u]=;
for(int i=hd[u];~i;i=E[i].nt){
int v=E[i].v;
if(v==fa)continue;
get_rt(v,u);
sz[u]+=sz[v];
mx[u]=max(mx[u],sz[v]);
}
mx[u]=max(m-sz[u],mx[u]);
if(mx[u]<Mx)Mx=mx[u];
}
void dfs(int u,int fa){
s[u]="(";
for(int i=hd[u];~i;i=E[i].nt){
int v=E[i].v;
if(v==fa)continue;
dfs(v,u);
}
tot=;
for(int i=hd[u];~i;i=E[i].nt){
int v=E[i].v;
if(v==fa)continue;
tmp[++tot]=s[v];
}
sort(tmp+,tmp+tot+);
for(int i=;i<=tot;i++)s[u]=s[u]+tmp[i];
s[u]+=")";
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj4337.in","r",stdin);
freopen("bzoj4337.out","w",stdout);
#endif
scanf("%d",&n);
for(int I=;I<=n;I++){
o=;memset(hd,-,sizeof(hd));
scanf("%d",&m);
for(int i=,x;i<=m;i++){
scanf("%d",&x);
if(x)adde(x,i);
}
Mx=m;get_rt(,);
now="";
for(int i=;i<=m;i++)if(Mx==mx[i]){
dfs(i,);
if(now<s[i])now=s[i];
}
ll x=;
for(int i=;i<(int)now.length();i++){
x = ((x<<) + now[i])%mod;
}
//printf("%s\n",now.c_str());
if(!h[x])h[x]=I;
printf("%d\n",h[x]);
}
return ;
}bzoj4337
- 无标号树的HASH:
【bzoj4337】【Bjoi2015】树的同构的更多相关文章
- bzoj4337: BJOI2015 树的同构 树哈希判同构
题目链接 bzoj4337: BJOI2015 树的同构 题解 树哈希的一种方法 对于每各节点的哈希值为hash[x] = hash[sonk[x]] * p[k]; p为素数表 代码 #includ ...
- [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1023 Solved: 436[Submit][Status ...
- BZOJ4337:[BJOI2015]树的同构(树hash)
Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如 ...
- BZOJ4337: BJOI2015 树的同构(hash 树同构)
题意 题目链接 Sol 树的同构问题,直接拿hash判一下,具体流程大概是这样的: 首先转化为有根树,预处理出第\(i\)棵树以\(j\)为根时的hash值. 那么两个树同构当且仅当把两棵树的hash ...
- bzoj4337: BJOI2015 树的同构
hash大法好 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...
- 【BZOJ4337】BJOI2015 树的同构 括号序列
[BZOJ4337]BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱 ...
- BZOJ 4337: BJOI2015 树的同构 树hash
4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...
- BZOJ4337:[BJOI2015]树的同构——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4337 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根, ...
- 4337: BJOI2015 树的同构
题解: 树的同构的判定 有根树从根开始进行树hash 先把儿子的f进行排序 $f[i]=\sum_{j=1}^{k} { f[j]*prime[j]} +num[i]$(我没有仔细想这样是不是树是唯一 ...
- [BJOI2015]树的同构
嘟嘟嘟 判断树的同构的方法就是树上哈希. 如果树是一棵有根树,那么只要从根节点出发dfs,每一个节点的哈希值等于按传统方式算出来的子树的哈希值的结果.需要注意的是,算完子树的哈希值后要先排序再加起来, ...
随机推荐
- 【RL系列】Multi-Armed Bandit笔记补充(二)
本篇的主题是对Upper Conference Bound(UCB)策略进行一个理论上的解释补充,主要探讨UCB方法的由来与相关公式的推导. UCB是一种动作选择策略,主要用来解决epsilon-gr ...
- Erlang数据类型的表示和实现(2)——Eterm 和立即数
Erlang 数据类型的内部表示和实现 Erlang 中的变量在绑定之前是自由的,非绑定变量可以绑定一次任意类型的数据.为了支持这种类型系统,Erlang 虚拟机采用的实现方法是用一个带有标签的机器字 ...
- DataGridView 复选框 操作大全
DataGridViewCheckBoxColumn dtCheck = new DataGridViewCheckBoxColumn(); dtCheck.DataPropertyName = &q ...
- OO学习第一阶段总结
前言 虽然之前接触过java,也写过一些1000行左右的程序.可以说面向对象的思想和java的一些基本语法对我来说是没有难度的,但是这学期的面向对象依然给了我一个下马威.这几次的作业每次都很让我头疼. ...
- 20162327WJH第二次实验——树
20162327WJH第一次实验--线性结构 实 验 报 告 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验 ...
- jsp九大内置对象之session和application
session和application 用的都是特别多尤其是application,但是想全面学习一下内置对象所以都了解一下. session又被称为是会话生存期是用户进入浏览器到关闭浏览器的期间.s ...
- 蜗牛慢慢爬 LeetCode 19. Remove Nth Node From End of List [Difficulty: Medium]
题目 Given a linked list, remove the nth node from the end of list and return its head. For example, G ...
- Mysql分库分表方案,如何分,怎样分?
https://www.cnblogs.com/phpper/p/6937896.html 为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这 ...
- JavaScript 稀奇的js语法
function c(expression) { console.log(expression); } c(-0); // -0 c(-0 === +0); // true c((-0).toStri ...
- 错误“AxImp.exe”已退出,代码为 -1163019603【转载及个人看法】
http://blog.csdn.net/duguduchong/article/details/17166123 最近使用vs2010 在重新生成解决方案的时候出现 “AxImp.exe”已退出, ...