这里的同构是指:

对于两棵树A, B,如果能通过重新标号使得两棵树完全相同,则称树A和B同构

Hash最小表示法步骤:

①暴力每个节点为根

②对于当前根x,对树进行DFS

③DFS时对每个节点维护一个字典序最小的括号序列

④对于两棵树A和B,如果存在x和y满足:A以x为根,B以y为根,x和y节点的括号序列完全一样,那么A和B同构

复杂度O(n³)

关于优化:完全不用暴力所有节点为根,只需要暴力树的重心就好了,因为每棵树重心最多只会有两个,所以复杂度可以降低一个n

4337: BJOI2015 树的同构

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 973  Solved: 414
[Submit][Status][Discuss]

Description

树是一种很常见的数据结构。
我们把N个点,N-1条边的连通无向图称为树。
若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树。
对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相
同,那么这两个树是同构的。也就是说,它们具有相同的形态。
现在,给你M个有根树,请你把它们按同构关系分成若干个等价类。

Input

第一行,一个整数M。
接下来M行,每行包含若干个整数,表示一个树。第一个整数N表示点数。接下来N
个整数,依次表示编号为1到N的每个点的父亲结点的编号。根节点父亲结点编号为0。

Output

输出M行,每行一个整数,表示与每个树同构的树的最小编号。

Sample Input

4
4 0 1 1 2
4 2 0 2 3
4 0 1 1 1
4 0 1 2 3

Sample Output

1
1
3
1
#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
vector<int> G[555];
string h[555], ans[555], temp[555], F;
int n, bet, hev[555], son[555];
void Sech(int u, int p)
{int i, v, now;now = 0, son[u] = 1;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;Sech(v, u);now = max(now, son[v]);son[u] += son[v];}now = max(now, n-son[u]);hev[u] = now;bet = min(bet, now);
}
void Jud(int u, int p)
{int i, v, now;h[u] = '(';for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;Jud(v, u);}now = 0;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;temp[++now] = h[v];}sort(temp+1, temp+now+1);for(i=1;i<=now;i++)h[u] += temp[i];h[u] += ')';
}
int main(void)
{int i, j, x, Q;scanf("%d", &Q);for(i=1;i<=Q;i++){scanf("%d", &n);for(j=1;j<=n;j++)G[j].clear();for(j=1;j<=n;j++){scanf("%d", &x);if(x!=0)G[x].push_back(j), G[j].push_back(x);}bet = n+5;Sech(1, 0);F = "";for(j=1;j<=n;j++){if(hev[j]==bet){Jud(j, 0);if(F=="" || h[j]<F)F = h[j];}}ans[i] = F;}for(i=1;i<=Q;i++){for(j=1;j<=Q;j++){if(ans[i]==ans[j]){printf("%d\n", j);break;}}}return 0;
}

无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)相关推荐

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

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

  2. BZOJ.4337.[BJOI2015]树的同构(树哈希)

    BZOJ 洛谷 \(Description\) 给定\(n\)棵无根树.对每棵树,输出与它同构的树的最小编号. \(n及每棵树的点数\leq 50\). \(Solution\) 对于一棵无根树,它的 ...

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

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

  4. 4337: BJOI2015 树的同构

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

  5. [BJOI2015] 树的同构

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

  6. 字符串循环同构的最小表示法(转)

    循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S'中字典序最小的一个. 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S'是S的循环同构的串 ...

  7. P5043 【模板】树同构([BJOI2015]树的同构 // P4323 [JSOI2016]独特的树叶

    一.P5043 [模板]树同构([BJOI2015]树的同构): #include<iostream> #include<cstdio> #include<algorit ...

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

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

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

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

最新文章

  1. c语言那些细节之a+1和a+1的区别
  2. Redis 使用 Lua 脚本进行原子操作
  3. 学会使用 GDB 调试 Go 代码
  4. python是开源语言吗c,属于新十年的开发语言:Go语言可能很快会取代Python
  5. vue-quill-editor富文本 回显数据样式失效
  6. JavaScript之Ajax-1 Ajax(Ajax原理、Ajax对象属性和方法)
  7. 深入理解JVM虚拟机 3.6
  8. WebSpider简介
  9. 【蓝桥杯集训·每日一题】AcWing 3777. 砖块
  10. Postgresql - 查询表引用或被引用的外键
  11. k阶子式、主子式、顺序主子式、余子式、代数余子式
  12. pareto最优解程序_求多目标优化问题Pareto最优解集的方法
  13. [世界杯] 澳大利亚 vs 日本 3:1
  14. 骑士编年史服务器没响应,骑士编年史非root刷初始方法
  15. snort--content中几个选项
  16. linux 下51单片机开发环境搭建
  17. Jetbrains2022下载地址
  18. 不错的DNS缓存软件DnsSpeeder
  19. C语言余数为0输出intact,C语言中的宏是怎么展开的?
  20. 用sfml(c++)写消消乐游戏(三消)

热门文章

  1. python画散点图-python学习之matplotlib绘制散点图实例
  2. python基础教程是什么-Python基础教程_Python入门知识
  3. 为什么都建议学java而不是python-现在学Python还是Java好呢?
  4. 普通人学python有意义吗-自学Python编程的第一天----------来自苦逼的转行人
  5. 自学python好找工作么-学习python后好找工作吗
  6. 语音识别中的CTC算法的基本原理解释
  7. 小米王育军:小爱背后的小米语音技术
  8. yarn在vscode里启动报错
  9. java 字节序列_java – 在字节数组中存储二进制序列?
  10. 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)