\(\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 树同构的更多相关文章

  1. luogu P5043 【模板】树同构 hash 最小表示法

    LINK:模板 树同构 题目说的很迷 给了一棵有根树 但是重新标号 言外之意还是一棵无根树 然后要求判断是否重构. 由于时无根的 所以一个比较显然的想法暴力枚举根. 然后做树hash或者树的最小表示法 ...

  2. uva12489 Combating cancer(树同构)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud https://uva.onlinejudge.org/index.php?opt ...

  3. BZOJ4337: BJOI2015 树的同构(hash 树同构)

    题意 题目链接 Sol 树的同构问题,直接拿hash判一下,具体流程大概是这样的: 首先转化为有根树,预处理出第\(i\)棵树以\(j\)为根时的hash值. 那么两个树同构当且仅当把两棵树的hash ...

  4. Luogu 5043 【模板】树同构([BJOI2015]树的同构)

    BZOJ 4337 简单记录一种树哈希的方法:以$x$为根的子树的哈希值为$\sum_{y \in son(x)}f_y*base_i$,$f_y$表示以$y$为根的树的哈希值,其中$i$表示$f_y ...

  5. 『Andrew and Chemistry 树同构』

    Andrew and Chemistry Description During the chemistry lesson Andrew learned that the saturated hydro ...

  6. 【CF1252F】Regular Forestation(重心,树同构)

    题意:给定一棵n个点的树,问删去某个点之后所有的树同构,这样分割出来的树最多能有几棵 n<=4000 思路:分割成至少两个size相等的联通块之后size必定小于n/2,与树的重心的定义相同 预 ...

  7. 题解 P5043 【【模板】树同构([BJOI2015]树的同构)】

    进入正题 题意:将所有树结构相同的树归类. 思路 嗯,这道题让我们把树的结构归类,自然而然就想到了哈希,我们对这整颗树哈希一遍.然后判同构就十分之简单了.只需要找哈希值一样的树就可以了. 其实真得很简 ...

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

    传送门 把所有的树给哈希起来就好了 具体的方法是一个节点的哈希值就是它所有儿子的哈希值给哈希起来,然后以每个节点为根算出它作为根节点的哈希值.那么把每棵树的哈希值排个序,与之前的比较就好了 注意把儿子 ...

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

    思路:树哈希 提交:1次 题解: 怕不是用的oi-wiki上的公式: \[f_u=size_u\times\sum f_{son_{u,i}}\times Base^{i-1}\] #include& ...

  10. 洛谷 P5043 树的同构 题解

    题面 本题的难度其实不及紫题的难度.主要是在hash时的处理细节比较繁琐: 首先是树hash的模板: long long treehash(int u,int fa) { ]; ; ; for(int ...

随机推荐

  1. python3小技巧总结(实时更新)

    1.列表解析 如果一个想将一个列表中的大于0的数字过滤,一般可能会用到lambd结合filter,或者就是直接遍历,不过最好的解决办法是这样: b = [1,0,-1,-2] a = [i for i ...

  2. 目标检测模型的评价标准-AP与mAP

    目录 目录 目录 前言 一,精确率.召回率与F1 1.1,准确率 1.2,精确率.召回率 1.3,F1 分数 1.4,PR 曲线 1.4.1,如何理解 P-R 曲线 1.5,ROC 曲线与 AUC 面 ...

  3. 【Java EE】Day02 MySQL概念、软件、语句

    〇.总结 1. 一.数据库的基本概念 1.概念 用于存储和管理数据的仓库 特点: 持久化存储,本质是文件系统 方便存储和管理数据 使用统一方式(MySQL)操作 常见的数据库软件: MySQL:Ora ...

  4. 2A锂电池充电管理IC,具有恒压/恒流充电模式

    PW4052 是一颗适用于单节锂电池的.具有恒压/恒流充电模式的充电管理 IC.该芯片采用开关型的工作模 式, 能够为单节锂电池提供快速. 高效且简单的充电管理解决方案. PW4052 采用三段式充电 ...

  5. 使用pycharm or vscode来编写python代码?

    pycharm社区版可用于商业项目 pycharm社区版可用于商业项目,来源于官方的回答:Can I use Community Editions of JetBrains IDEs for deve ...

  6. vulnhub靶场之DARKHOLE: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:DarkHole: 1,下载地址:https://download.vulnhub.com/darkhole/DarkHole.zip,下载后直 ...

  7. Django视图层/FBV与CBV/jsonResponse对象/form表单上传文件/request对象获取文件

    目录 虚拟环境 视图层views 三板斧 jsonResponse对象 form如何上传文件/request对象获取文件 request对象方法 FBV与CBV CBV源码解析 虚拟环境 每创建一个虚 ...

  8. Javascript | 模拟mvc实现点餐程序

    MVC模式是一个比较成熟的开发模式.M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.其中,View的定义比较清晰,就是用 ...

  9. Anaconda下载安装

    下载地址: 链接:https://pan.baidu.com/s/1fmJkMSL6amJF4KP5JwklOQ 提取码:dsyc 安装完成之后,记得配置系统环境变量:

  10. electron中使用adm-zip将多个excel文件压缩进文件夹,使用XLSX以及XLSXStyle生成带样式excel文件

    需求:electron环境下想要实现根据多个表生成多个Excel文件,打包存入文件夹内并压缩下载到本地.(实际场景描述:界面中有软件工程一班学生信息.软件工程二班学生信息.软件工程三班学生信息,上方有 ...