BZOJ.4337.[BJOI2015]树的同构(树哈希)
BZOJ
洛谷
\(Description\)
给定\(n\)棵无根树。对每棵树,输出与它同构的树的最小编号。
\(n及每棵树的点数\leq 50\)。
\(Solution\)
对于一棵无根树,它的重心最多不超过两个。
所以从两个重心分别DFS,可以将无根树转为有根树。选Hash值较小或较大的做整棵树的Hash值好了。
然后可以用树哈希,或者括号序(直接用string)来表示每棵树。
对于每个点的每棵子树,可以对哈希值或字符串sort一下用最小表示法记录。
//936kb 20ms
#include <cstdio>
#include <cctype>
#include <string>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=53;std::string str[N],s[N];
struct Tree
{int Min,Enum,H[N],nxt[N<<1],to[N<<1],sz[N],f[N];inline void AE(int u,int v){if(u)to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum,to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;}void Find_root(int x,int fa,int tot){int mx=0; sz[x]=1;for(int i=H[x],v; i; i=nxt[i])if((v=to[i])!=fa)Find_root(v,x,tot), sz[x]+=sz[v], mx=std::max(mx,sz[v]);Min=std::min(Min,f[x]=std::max(mx,tot-sz[x]));}void DFS(int x,int fa){static std::string tmp[N];s[x]="(";for(int i=H[x]; i; i=nxt[i])if(to[i]!=fa) DFS(to[i],x);int t=0;for(int i=H[x]; i; i=nxt[i])//先处理完其它子树 才能用这个tmp数组啊→_→ if(to[i]!=fa) tmp[++t]=s[to[i]];std::sort(tmp+1,tmp+1+t);for(int i=1; i<=t; ++i) s[x]+=tmp[i];s[x]+=")";}
}T[N];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}int main()
{int tot=read();for(int t=1; t<=tot; ++t){int n=read();for(int i=1; i<=n; ++i) T[t].AE(read(),i);T[t].Min=N, T[t].Find_root(1,1,n);std::string now="";for(int i=1; i<=n; ++i)if(T[t].f[i]==T[t].Min) T[t].DFS(i,i), now=std::max(now,s[i]);str[t]=now;}for(int i=1; i<=tot; ++i){int j=1;while(str[i]!=str[j]) ++j;printf("%d\n",j);}return 0;
}
转载于:https://www.cnblogs.com/SovietPower/p/10193664.html
BZOJ.4337.[BJOI2015]树的同构(树哈希)相关推荐
- 2.3 树的同构(树,c)
树的同构 树的同构 输入格式: 输出格式: 输入样例1(对应图1): 输出样例1: 输入样例2(对应图2): 输出样例2: 题意理解 输入两棵二叉树的信息,判断是否同构(对应图1) 求解思路 二叉树表 ...
- 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)
这里的同构是指: 对于两棵树A, B,如果能通过重新标号使得两棵树完全相同,则称树A和B同构 Hash最小表示法步骤: ①暴力每个节点为根 ②对于当前根x,对树进行DFS ③DFS时对每个节点维护一个 ...
- [树hash]BZOJ 4337——BJOI2015 树的同构
题目梗概 对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相 同,那么这两个树是同构的. 有M个有根树,请你把它们按同构关系分成若干个等价类. 解题思路 第一次写树has ...
- P5043 【模板】树同构([BJOI2015]树的同构) 树的hash
题意 对于两个树 T1T_1T1 和 T2T_2T2,如果能够把树 T1T_1T1 的所有点重新标号,使得树 T1T_1T1 和树 完 T2T_2T2 全相同,那么这两个树是同构的.给你多棵 ...
- BZOJ 4337: BJOI2015 树的同构|Hash
此题三战三卒--!! 一卒:没有考虑连边的顺序. 二卒:用排序解决了连边的顺序,然后用重心似乎搞不了-- 三卒:考虑到rp问题,换了换hash的数..三卒! 扔了重心终于A掉了 可以用括号序列,然后h ...
- 【BZOJ - 4337】BJOI2015 树的同构(树哈希)
题干: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的 ...
- bzoj 4337 树的同构
4337: BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树 ...
- 4337: BJOI2015 树的同构
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 171 Solved: 81 [ Submit][ St ...
- [BJOI2015] 树的同构
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1092 Solved: 460 [Submit][Stat ...
最新文章
- volatile 和 mutable 关键字
- 是程序员,就用python导出pdf
- linux apache两种工作模式详解
- 与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面
- Collections集合工具类的方法
- MS windows下的网络访问设置经典--仅来宾
- 数据库系统概论 -- 第一章 绪论(知识点)
- 手机android系统界面,Android 4.0系统,界面很原生
- 题解 P2212 【[USACO14MAR]浇地Watering the Fields】
- php 机器人的运动范围,ABB机器人高级技巧,区域监控,多任务,限定单轴运动范围,奇异点的管理...
- Spark开发环境的搭建(一)
- 5个增加设计趣味性的方法
- 02中国华南华东华北华中华西等位置画出来
- listview距离顶端白边
- python报错TypeError: must be str, not int
- 作为一名java开发人员,不了解jvm调优对工作有什么影响?
- oschina 公司已成立
- 开发常用的Git命令
- MybatisPlus中and和or的使用
- 卷积神经网络(CNN)开山之作——LeNet-5。卷积神经网络基本介绍。
热门文章
- linux Rh界面,Ubuntu Linux与RH系列的不同之处
- xpath 取标签下所有文字内容_如何理解葡萄酒标签上的所有内容(下)
- python编程英语单词怎么写_用Python写一个背英文单词程序
- 电脑打字学习_新手如何学会电脑打字 走上盲打之路
- LeetCode-107二叉树的层次遍历 II-BFS实现
- 系统学习深度学习(二十三)--SqueezeNet
- 2015-FCN论文解读
- 【数据库原理实验(openGauss)】金融场景化实验
- 归并排序的时间复杂度
- hadoop longwritable类