[BJOI2015]树的同构
嘟嘟嘟
判断树的同构的方法就是树上哈希。
如果树是一棵有根树,那么只要从根节点出发dfs,每一个节点的哈希值等于按传统方式算出来的子树的哈希值的结果。需要注意的是,算完子树的哈希值后要先排序再加起来,因为交换两棵子树对于判断同构不影响。
对于无根树,我们应该选一个点,满足树的标号改变后树的形态没有变。所以就选重心好了。重心可能有两个(一条边的两个端点上),所以分别求一遍哈希取max(min)即可。
结果这题卡我的哈希(可能是我太菜了),最后写成ret = ((ret * base) | t[i]) % mod才过,自然溢出都不出行。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const ull base = 19260817;
const ull mod = 1e9 + 7;
const int maxn = 55;
inline ll read()
{ll ans = 0;char ch = getchar(), last = ' ';while(!isdigit(ch)) last = ch, ch = getchar();while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();if(last == '-') ans = -ans;return ans;
}
inline void write(ll x)
{if(x < 0) x = -x, putchar('-');if(x >= 10) write(x / 10);putchar(x % 10 + '0');
}int m, n;
struct Edge
{int nxt, to;
}e[maxn << 1];
int head[maxn], ecnt = -1;
In void addEdge(int x, int y)
{e[++ecnt] = (Edge){head[x], y};head[x] = ecnt;
}int siz[maxn], dp[maxn], G = INF;
In void dfs1(int now, int _f)
{siz[now] = 1; dp[now] = 0;for(int i = head[now], v; ~i; i = e[i].nxt){if((v = e[i].to) == _f) continue;dfs1(v, now);siz[now] += siz[v];dp[now] = max(dp[now], siz[v]);}dp[now] = max(dp[now], n - siz[now]);G = min(G, dp[now]);
}ull ans[maxn];
In ull dfs2(int now, int _f)
{ull ret = 1343247397;vector<ull> tp;for(int i = head[now], v; ~i; i = e[i].nxt){if((v = e[i].to) == _f) continue;tp.push_back(dfs2(v, now));}sort(tp.begin(), tp.end());for(int i = 0; i < (int)tp.size(); ++i) ret = ((ret * base) ^ tp[i]);return ret;
}In void init()
{Mem(head, -1); ecnt = -1;G = INF;
}int main()
{//freopen("2.in", "r", stdin);//freopen("ha.out", "w", stdout);m = read();for(int i = 1; i <= m; ++i){init();n = read();for(int j = 1; j <= n; ++j){int x = read();if(x) addEdge(x, j), addEdge(j, x);}dfs1(1, 0);for(int j = 1; j <= n; ++j)if(dp[j] == G) ans[i] = max(ans[i], dfs2(j, 0));}for(int i = 1; i <= m; ++i)for(int j = 1; j <= i; ++j)if(ans[i] == ans[j]) {write(j), enter; break;}return 0;
}
转载于:https://www.cnblogs.com/mrclr/p/10551294.html
[BJOI2015]树的同构相关推荐
- [BJOI2015] 树的同构
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1092 Solved: 460 [Submit][Stat ...
- 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)
这里的同构是指: 对于两棵树A, B,如果能通过重新标号使得两棵树完全相同,则称树A和B同构 Hash最小表示法步骤: ①暴力每个节点为根 ②对于当前根x,对树进行DFS ③DFS时对每个节点维护一个 ...
- P5043 【模板】树同构([BJOI2015]树的同构 // P4323 [JSOI2016]独特的树叶
一.P5043 [模板]树同构([BJOI2015]树的同构): #include<iostream> #include<cstdio> #include<algorit ...
- 4337: BJOI2015 树的同构
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 171 Solved: 81 [ Submit][ St ...
- 【BZOJ - 4337】BJOI2015 树的同构(树哈希)
题干: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的 ...
- 洛谷-5043 【模板】树同构([BJOI2015]树的同构)
题目描述 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1T_1T1和T2T_2 ...
- P5043 【模板】树同构([BJOI2015]树的同构) 树的hash
题意 对于两个树 T1T_1T1 和 T2T_2T2,如果能够把树 T1T_1T1 的所有点重新标号,使得树 T1T_1T1 和树 完 T2T_2T2 全相同,那么这两个树是同构的.给你多棵 ...
- [树hash]BZOJ 4337——BJOI2015 树的同构
题目梗概 对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相 同,那么这两个树是同构的. 有M个有根树,请你把它们按同构关系分成若干个等价类. 解题思路 第一次写树has ...
- BZOJ.4337.[BJOI2015]树的同构(树哈希)
BZOJ 洛谷 \(Description\) 给定\(n\)棵无根树.对每棵树,输出与它同构的树的最小编号. \(n及每棵树的点数\leq 50\). \(Solution\) 对于一棵无根树,它的 ...
最新文章
- 关系数据库和nosql
- Linux学习之系统编程篇:编写一个守护进程
- 水题 逆序对 NOIP 2013 火柴排队
- 如何计算和控制好项目开发成本?
- Effective Java之对可恢复的情况使用受检异常,对编程错误使用运行时异常(五十八)
- python时间序列进行线性插值_Python实现线性插值和三次样条插值
- 使用Spring Reactor Core进行分散收集
- java judgefilecode_VScode出现无法打开“X”: 找不到文件(file:///XXXX) 的解决办法
- vim配置之snippets代码块
- Firefox 检测到该服务器正在将此地址的请求循环重定向。 此问题可能是因为禁用或拒绝 Cookie 导致。...
- 8年php薪資,8年PHP求稳定远程团队带走
- 单片机中去耦电容的使用
- Ionic!用Web技术开发移动应用!
- 计算机公开课打字游戏,H5公开课:古堡密卷--打字通关游戏设计及开发
- 曾经使用过的chart控件(mschart,XCL-Chart,vue-echart)
- 微信浏览器ISO系统底部导航栏
- 盘点五款好用的项目管理软件
- IMWeb小白-诗歌作业
- XUGU:利空频传,建网站如何去赚钱?
- 【论文阅读笔记】High Quality Monocular Depth Estimation via Transfer Learning
热门文章
- Android中悬浮窗口的实现原理和示例代码
- TReader高速文本浏览器 1.0 发布
- QuickPager asp.net 分页控件 转
- 实时获取ccd图像_薄膜瑕疵在线检测系统0.1mm检测精度_实时在线检测
- python网络爬虫程序_使用Python写的第一个网络爬虫程序
- 华为云交付项目服务器配置表,云端服务器配置表
- maven排除依赖包的子依赖_漫画谈一下Maven依赖
- pycharm配置python解释器_Python大佬手把手教你进行Pycharm活动模板配置
- 风变编程python小课课件_风变编程Python小课最近很火,大家学完感受如何?
- MATLAB修改工作环境