「洛谷 P5043」:树同构【树哈希】
P5043 【模板】树同构([BJOI2015]树的同构
题目描述
树是一种很常见的数据结构。
我们把NNN个点,N−1N−1N−1条边的连通无向图称为树。
若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树。
对于两个树T1T_1T1和T2T_2T2,如果能够把树T1T_1T1的所有点重新标号,使得树T1T_1T1和树T2T_2T2完全相同,那么这两个树是同构的。也就是说,它们具有相同的形态。
现在,给你MMM个有根树,请你把它们按同构关系分成若干个等价类。
输入格式
第一行,一个整数MMM。
接下来MMM行,每行包含若干个整数,表示一个树。第一个整数NNN表示点数。接下来NNN个整数,依次表示编号为111到NNN的每个点的父亲结点的编号。根节点父亲结点编号为000。
输出格式
输出MMM行,每行一个整数,表示与每个树同构的树的最小编号。
输入输出样例
输入 #1
4
4 0 1 1 2
4 2 0 2 3
4 0 1 1 1
4 0 1 2 3
输出 #1
1
1
3
1
说明/提示
编号为1,2,41, 2, 41,2,4 的树是同构的。编号为333 的树只与它自身同构。
100%100\%100% 的数据中,1≤N,M≤501\leq N,M\leq501≤N,M≤50
题意
- 就是给你mmm颗有根树,问与每一棵树同构的最早输入的那棵树是哪一个
题解
- 树HashHashHash模板题
- 也就是给每一个节点赋一个值,然后先求出以儿子为根的子树的hashhashhash,然后用进制hashhashhash依次把当前节点和所有儿子结合到一起,显然如果两棵树是同构的,但是如果hashhashhash时的顺序不一样,hashhashhash的结果也是不一样的,所以考虑给所有的儿子的hashhashhash值排序再从小到大做hashhashhash
- 判断两棵树是否同构不能只是n2n^2n2枚举两颗树的根结点并判断以他们两个为根的树hashhashhash是否相同,相同就是同构的。正确的姿势应该是给每一棵树以每一个节点为根的树hashhashhash排序,然后比较两棵树对应的排序后的数组是否完全一致,如果是,则同构
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=55;
const int base=23333;
const long long mod=998244353;
int ans[maxn][maxn],fa[maxn],n,m,a[maxn];
vector<int> vec[maxn];long long dfs(int cur,int fa) {vector<long long> sta;long long ans=base;for(int i=0;i<vec[cur].size();i++) if(vec[cur][i]!=fa) sta.push_back(dfs(vec[cur][i],cur));sort(sta.begin(),sta.end());for(auto i:sta) ans=ans*base+i;return ans;
}int main() {scanf("%d",&m);for(int i=1;i<=m;i++) {scanf("%d",&a[i]); //n of each treen=a[i];for(int j=1;j<=n;j++) {scanf("%d",&fa[j]);if(!fa[j]) continue;vec[j].push_back(fa[j]);vec[fa[j]].push_back(j);}for(int j=1;j<=n;j++) ans[i][j]=dfs(j,0);sort(ans[i],ans[i]+n+1);int same=i;for(int j=1;j<n;j++) {bool ok=true;if(a[i]!=a[j]) continue;for(int k=1;k<=n;k++) if(ans[j][k]!=ans[i][k]) {ok=false;break;}if(ok) {same=j;break;}}printf("%d\n",same);for(int i=1;i<=n;i++) vec[i].clear();}
}
「洛谷 P5043」:树同构【树哈希】相关推荐
- 洛谷 - P5043 【模板】树同构([BJOI2015]树的同构)(树上哈希)
题目链接:点击查看 题目大意:给出 m 棵树,对于第 i 棵树而言,找到 1 ~ i 中与当前树同构的最小 id 题目分析:判断有向树同构,可以预处理出质数数组 p ,然后树形 dp ,设 u 为当前 ...
- 「洛谷2495」「BZOJ3052」「SDOI2001」消耗战【虚树+树形动态规划】
题目大意 给你\(k\)个点,让这一些点和一号节点断开,删去某一些边,求最小的删去边权之和. 做题的心路历程 做了\(HG\)昨天的模拟赛,深深感觉到了窝的菜,所以为了\(A\)掉T1这一道毒瘤,窝就 ...
- 「洛谷P3469」[POI2008]BLO-Blockade 解题报告
P3469[POI2008]LO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个 ...
- 「洛谷P1343」地震逃生 解题报告
P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...
- 「洛谷P2397」 yyy loves Maths VI (mode) 解题报告
P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...
- 「洛谷 3768」简单的数学题
传送门 problem 给定 nnn 和 ppp,求: ∑i=1n∑j=1nijgcd(i,j)\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)i=1∑nj=1∑nijgc ...
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- 洛谷P4315 月下“毛景树” 题解
洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...
- 洛谷——P1047 校门外的树 python实现
洛谷--P1047 校门外的树 python实现 l, m = map(int, input().split(' ')) trees = [True]*(l+1) for i in range(m): ...
最新文章
- 外部电源、锂电池供电自动切换并自动给电池充电的电路
- svn文件丢失的解法
- android sqlite 参数,Android SQLite3命令详解教程
- Android --- TabLayout 每一个选项卡前面加图标
- 浅析何时进行概况分析
- MFC中获取任务栏大小
- fst java_java快速序列化库FST
- 继云计算巨头失火事件后,微软决定送数据中心去“泡澡”!
- 华三 h3c 单臂路由配置
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门
- TraceView工具如何使用
- Angular 1 实现多标签页效果
- 深信服校园招聘安全攻防A卷
- 移动端-K线图-开发
- centos 磁盘重新分区操作实践
- 斐波那契回调线怎么画_斐波那契回调线的运用
- 4家外国支持支付宝支付的域名注册商
- 软考高级 真题 2011年下半年 信息系统项目管理师 论文
- 011 Verilog原语
- 爱情,最幸福的信仰!
热门文章
- nodejs模仿优酷网站,有后端
- 懒汉克辽尼和铜城的故事
- 受Intel的CPU缺货影响,联想在笔记本市场跌至全球第三?
- 【算法】动态规划 背包问题 python
- SQL Server触发器
- python清晰度增强_3行代码Python搞定图片清晰度识别,原来我们看到的不一定是这样的...
- 进销存设计与分析_应收明细表(16)
- 2023年浙大MBA复试生死线考生的调剂选择
- 继鹏城之后再攻蓉城,华为智能体如何高起步?
- 美游客猛增 中国在纽约推介新“丝绸之路”旅游