LG P5043 树同构
\(\text{problem}\)
无根树同构的判断
\(\text{Analysis}\)
考虑树哈希,注意使用较正确的哈希方法
无根树同构有个性质
只要判断以这两棵树的重心为根是否同构即可
\(\text{Code}\)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 105, INF = 0x3f3f3f3f, P = 998244353;
int m, n, rt, siz[N], h[N], son[N], hash[N], tot;
struct edge{
int to, nxt;
}e[N];
inline void add(int x, int y)
{
e[++tot] = edge{y, h[x]}, h[x] = tot;
}
void getrt(int x, int fa)
{
siz[x] = 1, son[x] = 0;
for(int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
getrt(v, x), siz[x] += siz[v];
son[x] = max(son[x], siz[v]);
}
son[x] = max(son[x], n - siz[x]);
rt = son[x] < son[rt] ? x : rt;
}
int hs[N][N], hv[N];
inline bool cmp(int x, int y){return hv[x] < hv[y];}
int dfs(int x, int fa)
{
int res = 2021; hs[x][0] = 0, siz[x] = 1;
for(int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
dfs(v, x), siz[x] += siz[v], hs[x][++hs[x][0]] = v;
}
sort(hs[x] + 1, hs[x] + hs[x][0] + 1, cmp);
for(int i = 1; i <= hs[x][0]; i++) res = ((long long)hv[hs[x][i]] * siz[hs[x][i]] + res) % P;
return hv[x] = res;
}
int main()
{
scanf("%d", &m), son[0] = INF;
for(int j = 1; j <= m; j++)
{
scanf("%d", &n);
tot = 0, memset(h, 0, sizeof h);
for(int i = 1, x; i <= n; i++)
{
scanf("%d", &x);
if (x) add(x, i), add(i, x);
}
rt = 0, getrt(1, 0), hash[j] = dfs(rt, 0);
for(int i = 1; i <= n; i++)
if (i ^ rt && siz[i] == son[rt]) hash[j] = min(hash[j], dfs(i, 0));
for(int i = 1; i <= j; i++)
if (hash[i] == hash[j]){printf("%d\n", i); break;}
}
}
LG P5043 树同构的更多相关文章
- luogu P5043 【模板】树同构 hash 最小表示法
LINK:模板 树同构 题目说的很迷 给了一棵有根树 但是重新标号 言外之意还是一棵无根树 然后要求判断是否重构. 由于时无根的 所以一个比较显然的想法暴力枚举根. 然后做树hash或者树的最小表示法 ...
- uva12489 Combating cancer(树同构)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud https://uva.onlinejudge.org/index.php?opt ...
- BZOJ4337: BJOI2015 树的同构(hash 树同构)
题意 题目链接 Sol 树的同构问题,直接拿hash判一下,具体流程大概是这样的: 首先转化为有根树,预处理出第\(i\)棵树以\(j\)为根时的hash值. 那么两个树同构当且仅当把两棵树的hash ...
- Luogu 5043 【模板】树同构([BJOI2015]树的同构)
BZOJ 4337 简单记录一种树哈希的方法:以$x$为根的子树的哈希值为$\sum_{y \in son(x)}f_y*base_i$,$f_y$表示以$y$为根的树的哈希值,其中$i$表示$f_y ...
- 『Andrew and Chemistry 树同构』
Andrew and Chemistry Description During the chemistry lesson Andrew learned that the saturated hydro ...
- 【CF1252F】Regular Forestation(重心,树同构)
题意:给定一棵n个点的树,问删去某个点之后所有的树同构,这样分割出来的树最多能有几棵 n<=4000 思路:分割成至少两个size相等的联通块之后size必定小于n/2,与树的重心的定义相同 预 ...
- 题解 P5043 【【模板】树同构([BJOI2015]树的同构)】
进入正题 题意:将所有树结构相同的树归类. 思路 嗯,这道题让我们把树的结构归类,自然而然就想到了哈希,我们对这整颗树哈希一遍.然后判同构就十分之简单了.只需要找哈希值一样的树就可以了. 其实真得很简 ...
- P5043 【模板】树同构([BJOI2015]树的同构)
传送门 把所有的树给哈希起来就好了 具体的方法是一个节点的哈希值就是它所有儿子的哈希值给哈希起来,然后以每个节点为根算出它作为根节点的哈希值.那么把每棵树的哈希值排个序,与之前的比较就好了 注意把儿子 ...
- P5043【模板】树同构([BJOI2015]树的同构)
思路:树哈希 提交:1次 题解: 怕不是用的oi-wiki上的公式: \[f_u=size_u\times\sum f_{son_{u,i}}\times Base^{i-1}\] #include& ...
- 洛谷 P5043 树的同构 题解
题面 本题的难度其实不及紫题的难度.主要是在hash时的处理细节比较繁琐: 首先是树hash的模板: long long treehash(int u,int fa) { ]; ; ; for(int ...
随机推荐
- OpenLooKeng
一.登录注册 网址为:https://tryme.openlookeng.io/,进入该网址后可以看到以下界面: 可以选择左边的GitHub或者右边的Gitee进行登录,如果没有账号需要注册一个账号进 ...
- Java语言进阶 day02【Collection、泛型】
主要内容 Collection集合 迭代器 增强for 泛型 教学目标
- JavaEE Day00 Java Web课程介绍
1.什么是Java Web? 使用Java语言开发互联网项目,简单理解为使用Java语言开发网站 2.课程介绍:30天 1.数据库(5天,第一阶段) 2.静态网页前端(5天,第二阶段) 3.Web核心 ...
- JavaFX入门笔记
JavaFX入门笔记 背景 Java选修课第四次实验 所需工具 IDEA JavaFX插件(需要Maven) JavaFX Scene Builder 参考资料 https://www.yiibai. ...
- Windows下使用VSCode搭建IDA Python脚本开发环境
由于本人是VSCode的重度沉迷用户,需要写代码时总会想起这个软件,因此选择在VSCode中搭建IDA Python的开发环境 本文适用的环境如下: 1.操作系统 windows 2.Python3 ...
- 监控Android(生成木马)
生成木马: sudo su msfvenom --platform android -p android/meterpreter/reverse_tcp lhost=IP地址 lport=端口号 R ...
- APP兼容测试点与WEB兼容测试点
APP兼容测试点 WEB兼容测试点
- 【WPF】自定义一个自删除的多功能ListBox
原文地址 https://www.cnblogs.com/younShieh/p/17008534.html 如果本文对你有所帮助,不妨点个关注和推荐呀,这是对笔者最大的支持~ 我需要一个ListBo ...
- 【转载】EXCEL VBA 工作簿(表)合并拆分
一.合并工作簿 Sub 合并工作簿() Application.ScreenUpdating = False myfile = Dir(ThisWorkbook.Path & & ...
- [OpenCV实战]18 Opencv中的单应性矩阵Homography
目录 1 介绍 1.1 什么是Homography 1.2 使用Homography进行图像对齐 1.3 Homography的应用-全景拼接 2 Homography的计算 3 总结 4 参考 &l ...