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]树的同构(树哈希)相关推荐

  1. 2.3 树的同构(树,c)

    树的同构 树的同构 输入格式: 输出格式: 输入样例1(对应图1): 输出样例1: 输入样例2(对应图2): 输出样例2: 题意理解 输入两棵二叉树的信息,判断是否同构(对应图1) 求解思路 二叉树表 ...

  2. 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)

    这里的同构是指: 对于两棵树A, B,如果能通过重新标号使得两棵树完全相同,则称树A和B同构 Hash最小表示法步骤: ①暴力每个节点为根 ②对于当前根x,对树进行DFS ③DFS时对每个节点维护一个 ...

  3. [树hash]BZOJ 4337——BJOI2015 树的同构

    题目梗概 对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相 同,那么这两个树是同构的. 有M个有根树,请你把它们按同构关系分成若干个等价类. 解题思路 第一次写树has ...

  4. P5043 【模板】树同构([BJOI2015]树的同构) 树的hash

    题意 对于两个树 T1T_1T1​ 和 T2T_2T2​,如果能够把树 T1T_1T1​ 的所有点重新标号,使得树 T1T_1T1​ 和树 完 T2T_2T2​ 全相同,那么这两个树是同构的.给你多棵 ...

  5. BZOJ 4337: BJOI2015 树的同构|Hash

    此题三战三卒--!! 一卒:没有考虑连边的顺序. 二卒:用排序解决了连边的顺序,然后用重心似乎搞不了-- 三卒:考虑到rp问题,换了换hash的数..三卒! 扔了重心终于A掉了 可以用括号序列,然后h ...

  6. 【BZOJ - 4337】BJOI2015 树的同构(树哈希)

    题干: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的 ...

  7. bzoj 4337 树的同构

    4337: BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树 ...

  8. 4337: BJOI2015 树的同构

    4337: BJOI2015 树的同构 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 171   Solved: 81 [ Submit][ St ...

  9. [BJOI2015] 树的同构

    4337: BJOI2015 树的同构 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1092  Solved: 460 [Submit][Stat ...

最新文章

  1. volatile 和 mutable 关键字
  2. 是程序员,就用python导出pdf
  3. linux apache两种工作模式详解
  4. 与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面
  5. Collections集合工具类的方法
  6. MS windows下的网络访问设置经典--仅来宾
  7. 数据库系统概论 -- 第一章 绪论(知识点)
  8. 手机android系统界面,Android 4.0系统,界面很原生
  9. 题解 P2212 【[USACO14MAR]浇地Watering the Fields】
  10. php 机器人的运动范围,ABB机器人高级技巧,区域监控,多任务,限定单轴运动范围,奇异点的管理...
  11. Spark开发环境的搭建(一)
  12. 5个增加设计趣味性的方法
  13. 02中国华南华东华北华中华西等位置画出来
  14. listview距离顶端白边
  15. python报错TypeError: must be str, not int
  16. 作为一名java开发人员,不了解jvm调优对工作有什么影响?
  17. oschina 公司已成立
  18. 开发常用的Git命令
  19. MybatisPlus中and和or的使用
  20. 卷积神经网络(CNN)开山之作——LeNet-5。卷积神经网络基本介绍。

热门文章

  1. linux Rh界面,Ubuntu Linux与RH系列的不同之处
  2. xpath 取标签下所有文字内容_如何理解葡萄酒标签上的所有内容(下)
  3. python编程英语单词怎么写_用Python写一个背英文单词程序
  4. 电脑打字学习_新手如何学会电脑打字 走上盲打之路
  5. LeetCode-107二叉树的层次遍历 II-BFS实现
  6. 系统学习深度学习(二十三)--SqueezeNet
  7. 2015-FCN论文解读
  8. 【数据库原理实验(openGauss)】金融场景化实验
  9. 归并排序的时间复杂度
  10. hadoop longwritable类