无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)
这里的同构是指:
对于两棵树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
Input
Output
Sample Input
Sample Output
#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 树的同构)相关推荐
- [树hash]BZOJ 4337——BJOI2015 树的同构
题目梗概 对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相 同,那么这两个树是同构的. 有M个有根树,请你把它们按同构关系分成若干个等价类. 解题思路 第一次写树has ...
- BZOJ.4337.[BJOI2015]树的同构(树哈希)
BZOJ 洛谷 \(Description\) 给定\(n\)棵无根树.对每棵树,输出与它同构的树的最小编号. \(n及每棵树的点数\leq 50\). \(Solution\) 对于一棵无根树,它的 ...
- BZOJ 4337: BJOI2015 树的同构|Hash
此题三战三卒--!! 一卒:没有考虑连边的顺序. 二卒:用排序解决了连边的顺序,然后用重心似乎搞不了-- 三卒:考虑到rp问题,换了换hash的数..三卒! 扔了重心终于A掉了 可以用括号序列,然后h ...
- 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 ...
- 字符串循环同构的最小表示法(转)
循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S'中字典序最小的一个. 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S'是S的循环同构的串 ...
- P5043 【模板】树同构([BJOI2015]树的同构 // P4323 [JSOI2016]独特的树叶
一.P5043 [模板]树同构([BJOI2015]树的同构): #include<iostream> #include<cstdio> #include<algorit ...
- 【BZOJ - 4337】BJOI2015 树的同构(树哈希)
题干: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的 ...
- P5043 【模板】树同构([BJOI2015]树的同构) 树的hash
题意 对于两个树 T1T_1T1 和 T2T_2T2,如果能够把树 T1T_1T1 的所有点重新标号,使得树 T1T_1T1 和树 完 T2T_2T2 全相同,那么这两个树是同构的.给你多棵 ...
最新文章
- c语言那些细节之a+1和a+1的区别
- Redis 使用 Lua 脚本进行原子操作
- 学会使用 GDB 调试 Go 代码
- python是开源语言吗c,属于新十年的开发语言:Go语言可能很快会取代Python
- vue-quill-editor富文本 回显数据样式失效
- JavaScript之Ajax-1 Ajax(Ajax原理、Ajax对象属性和方法)
- 深入理解JVM虚拟机 3.6
- WebSpider简介
- 【蓝桥杯集训·每日一题】AcWing 3777. 砖块
- Postgresql - 查询表引用或被引用的外键
- k阶子式、主子式、顺序主子式、余子式、代数余子式
- pareto最优解程序_求多目标优化问题Pareto最优解集的方法
- [世界杯] 澳大利亚 vs 日本 3:1
- 骑士编年史服务器没响应,骑士编年史非root刷初始方法
- snort--content中几个选项
- linux 下51单片机开发环境搭建
- Jetbrains2022下载地址
- 不错的DNS缓存软件DnsSpeeder
- C语言余数为0输出intact,C语言中的宏是怎么展开的?
- 用sfml(c++)写消消乐游戏(三消)
热门文章
- python画散点图-python学习之matplotlib绘制散点图实例
- python基础教程是什么-Python基础教程_Python入门知识
- 为什么都建议学java而不是python-现在学Python还是Java好呢?
- 普通人学python有意义吗-自学Python编程的第一天----------来自苦逼的转行人
- 自学python好找工作么-学习python后好找工作吗
- 语音识别中的CTC算法的基本原理解释
- 小米王育军:小爱背后的小米语音技术
- yarn在vscode里启动报错
- java 字节序列_java – 在字节数组中存储二进制序列?
- 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)