嘟嘟嘟

判断树的同构的方法就是树上哈希。

如果树是一棵有根树,那么只要从根节点出发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]树的同构相关推荐

  1. [BJOI2015] 树的同构

    4337: BJOI2015 树的同构 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1092  Solved: 460 [Submit][Stat ...

  2. 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)

    这里的同构是指: 对于两棵树A, B,如果能通过重新标号使得两棵树完全相同,则称树A和B同构 Hash最小表示法步骤: ①暴力每个节点为根 ②对于当前根x,对树进行DFS ③DFS时对每个节点维护一个 ...

  3. P5043 【模板】树同构([BJOI2015]树的同构 // P4323 [JSOI2016]独特的树叶

    一.P5043 [模板]树同构([BJOI2015]树的同构): #include<iostream> #include<cstdio> #include<algorit ...

  4. 4337: BJOI2015 树的同构

    4337: BJOI2015 树的同构 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 171   Solved: 81 [ Submit][ St ...

  5. 【BZOJ - 4337】BJOI2015 树的同构(树哈希)

    题干: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的 ...

  6. 洛谷-5043 【模板】树同构([BJOI2015]树的同构)

    题目描述 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1T_1T1​和T2T_2 ...

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

    题意 对于两个树 T1T_1T1​ 和 T2T_2T2​,如果能够把树 T1T_1T1​ 的所有点重新标号,使得树 T1T_1T1​ 和树 完 T2T_2T2​ 全相同,那么这两个树是同构的.给你多棵 ...

  8. [树hash]BZOJ 4337——BJOI2015 树的同构

    题目梗概 对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相 同,那么这两个树是同构的. 有M个有根树,请你把它们按同构关系分成若干个等价类. 解题思路 第一次写树has ...

  9. BZOJ.4337.[BJOI2015]树的同构(树哈希)

    BZOJ 洛谷 \(Description\) 给定\(n\)棵无根树.对每棵树,输出与它同构的树的最小编号. \(n及每棵树的点数\leq 50\). \(Solution\) 对于一棵无根树,它的 ...

最新文章

  1. 关系数据库和nosql
  2. Linux学习之系统编程篇:编写一个守护进程
  3. 水题 逆序对 NOIP 2013 火柴排队
  4. 如何计算和控制好项目开发成本?
  5. Effective Java之对可恢复的情况使用受检异常,对编程错误使用运行时异常(五十八)
  6. python时间序列进行线性插值_Python实现线性插值和三次样条插值
  7. 使用Spring Reactor Core进行分散收集
  8. java judgefilecode_VScode出现无法打开“X”: 找不到文件(file:///XXXX) 的解决办法
  9. vim配置之snippets代码块
  10. Firefox 检测到该服务器正在将此地址的请求循环重定向。     此问题可能是因为禁用或拒绝 Cookie 导致。...
  11. 8年php薪資,8年PHP求稳定远程团队带走
  12. 单片机中去耦电容的使用
  13. Ionic!用Web技术开发移动应用!
  14. 计算机公开课打字游戏,H5公开课:古堡密卷--打字通关游戏设计及开发
  15. 曾经使用过的chart控件(mschart,XCL-Chart,vue-echart)
  16. 微信浏览器ISO系统底部导航栏
  17. 盘点五款好用的项目管理软件
  18. IMWeb小白-诗歌作业
  19. XUGU:利空频传,建网站如何去赚钱?
  20. 【论文阅读笔记】High Quality Monocular Depth Estimation via Transfer Learning

热门文章

  1. Android中悬浮窗口的实现原理和示例代码
  2. TReader高速文本浏览器 1.0 发布
  3. QuickPager asp.net 分页控件 转
  4. 实时获取ccd图像_薄膜瑕疵在线检测系统0.1mm检测精度_实时在线检测
  5. python网络爬虫程序_使用Python写的第一个网络爬虫程序
  6. 华为云交付项目服务器配置表,云端服务器配置表
  7. maven排除依赖包的子依赖_漫画谈一下Maven依赖
  8. pycharm配置python解释器_Python大佬手把手教你进行Pycharm活动模板配置
  9. 风变编程python小课课件_风变编程Python小课最近很火,大家学完感受如何?
  10. MATLAB修改工作环境