题解:

树的同构的判定

有根树从根开始进行树hash

先把儿子的f进行排序

$f[i]=\sum_{j=1}^{k} { f[j]*prime[j]} +num[i]$(我没有仔细想这样是不是树是唯一的。。。反正过了)

无根树先找到重心再作为根

因为重心最多只有两个,复杂度仍旧O(n)

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define rint register int
  4. #define IL inline
  5. #define rep(i,h,t) for (int i=h;i<=t;i++)
  6. #define dep(i,t,h) for (int i=t;i>=h;i--)
  7. #define me(x) memset(x,0,sizeof(x))
  8. #define ll long long
  9. #define mep(x,y) memcpy(x,y,sizeof(y))
  10. #define mid ((h+t)>>1)
  11. #define ull unsigned ll
  12. namespace IO{
  13. char ss[<<],*A=ss,*B=ss;
  14. IL char gc()
  15. {
  16. return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
  17. }
  18. template<class T>void read(T &x)
  19. {
  20. rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
  21. while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
  22. }
  23. char sr[<<],z[]; int Z,C=-;
  24. template<class T>void wer(T x)
  25. {
  26. if (x<) sr[++C]='-',x=-x;
  27. while (z[++Z]=x%+,x/=);
  28. while (sr[++C]=z[Z],--Z);
  29. }
  30. IL void wer1() { sr[++C]=' ';}
  31. IL void wer2() { sr[++C]='\n';}
  32. template<class T>IL void maxa(T &x,T y) { if (x<y) x=y;}
  33. template<class T>IL void mina(T &x,T y) { if (x>y) x=y;}
  34. template<class T>IL T MAX(T x,T y) {return x>y?x:y;}
  35. template<class T>IL T MIN(T x,T y) {return x<y?x:y;}
  36. };
  37. using namespace IO;
  38. const int N=;
  39. int head[N],n,m,l,num[N],f[N];
  40. struct re{
  41. int a,b;
  42. }e[N*];
  43. bool q[];
  44. int zs[N];
  45. ull son[N][N],ans[N],g[N];
  46. IL void arr(int x,int y)
  47. {
  48. e[++l].a=head[x];
  49. e[l].b=y;
  50. head[x]=l;
  51. }
  52. void fdrt(int x,int y)
  53. {
  54. num[x]=;
  55. for (rint u=head[x];u;u=e[u].a)
  56. {
  57. int v=e[u].b;
  58. if (v!=y)
  59. {
  60. fdrt(v,x);
  61. num[x]+=num[v];
  62. if (num[v]>f[x]) f[x]=num[v];
  63. }
  64. }
  65. if (n-num[x]>f[x]) f[x]=n-num[x];
  66. }
  67. void dfs(int x,int y)
  68. {
  69. num[x]=;
  70. int cnt=;
  71. for (rint u=head[x];u;u=e[u].a)
  72. {
  73. int v=e[u].b;
  74. if (v!=y)
  75. {
  76. dfs(v,x);
  77. son[x][++cnt]=g[v];
  78. num[x]+=num[v];
  79. }
  80. }
  81. sort(son[x]+,son[x]+cnt+);
  82. ull now=;
  83. rep(i,,cnt) now=now+son[x][i]*zs[i];
  84. now+=num[x];
  85. g[x]=now;
  86. }
  87. int main()
  88. {
  89. freopen("1.in","r",stdin);
  90. freopen("1.out","w",stdout);
  91. read(m);
  92. rep(i,,)
  93. for (int j=;j*i<=;j++)
  94. q[i*j]=;
  95. int cnt=;
  96. rep(i,,)
  97. if (!q[i])
  98. {
  99. zs[++cnt]=i;
  100. if (cnt>=) break;
  101. }
  102. rep(j,,m)
  103. {
  104. me(head); read(n); me(f); l=;
  105. rep(i,,n)
  106. {
  107. int x,y; read(x);
  108. if (x) arr(x,i),arr(i,x);
  109. }
  110. fdrt(,);
  111. int ma=1e9;
  112. rep(i,,n) ma=min(ma,f[i]);
  113. rep(i,,n)
  114. if (f[i]==ma)
  115. {
  116. dfs(i,); maxa(ans[j],g[i]);
  117. }
  118. }
  119. rep(i,,m)
  120. rep(j,,m)
  121. if(ans[j]==ans[i])
  122. {
  123. cout<<j<<endl; break;
  124. }
  125. return ;
  126. }

4337: BJOI2015 树的同构的更多相关文章

  1. BZOJ 4337: BJOI2015 树的同构 树hash

    4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...

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

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

  3. [BZOJ4337][BJOI2015]树的同构(树的最小表示法)

    4337: BJOI2015 树的同构 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1023  Solved: 436[Submit][Status ...

  4. bzoj4337: BJOI2015 树的同构 树哈希判同构

    题目链接 bzoj4337: BJOI2015 树的同构 题解 树哈希的一种方法 对于每各节点的哈希值为hash[x] = hash[sonk[x]] * p[k]; p为素数表 代码 #includ ...

  5. 【BZOJ4337】BJOI2015 树的同构 括号序列

    [BZOJ4337]BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱 ...

  6. BZOJ4337:[BJOI2015]树的同构——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4337 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根, ...

  7. [BJOI2015]树的同构

    嘟嘟嘟 判断树的同构的方法就是树上哈希. 如果树是一棵有根树,那么只要从根节点出发dfs,每一个节点的哈希值等于按传统方式算出来的子树的哈希值的结果.需要注意的是,算完子树的哈希值后要先排序再加起来, ...

  8. BZOJ4337:[BJOI2015]树的同构(树hash)

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

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

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

随机推荐

  1. nginx(二)nginx的安装

    下载 nginx官网下载地址 把源码解压缩之后,在终端里运行如下命令: ./configure make make install 默认情况下,Nginx 会被安装在 /usr/local/nginx ...

  2. Kubernetes从懵圈到熟练:读懂这一篇,集群节点不下线

    排查完全陌生的问题,完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战.今天借这篇文章,跟大家分析一例这样的问题.排查过程中,需要理解一些自己完全陌生的组件,比如systemd和dbus. ...

  3. java 11 不可修改集合API

    不可修改集合API 自 Java 9 开始,Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别. 示例1: ...

  4. boost库在windows上的安装

    下载源码boost_1_70_0.zip 1.cmd进入boost源码包,运行bootstrap.bat生成bjam.exe 2.运行bjam.exe搞定 在visual studio配置 1. 项目 ...

  5. Mybatis的应用2 使用mybits+SpringBoot完成第一个查询的demo(随后加增加,更新,删除)

    首先在mapper下面新建一个mysql.xml mysql.xml <?xml version="1.0" encoding="UTF-8" ?> ...

  6. 更换gcc工具链

    title: 更换gcc工具链 date: 2019/1/16 19:27:51 toc: true --- 更换gcc工具链 下载后解压到一个临时目录先看看文件结构 mkdir tmp tar xj ...

  7. matlab运行出现“变量似乎会随着迭代次数改变而变化,请预分配内存,以提高运行速度”问题

    这句话大致意思就是: b = 0;for i = 1:3    a(i) = b;end是说变量的长度是变化的,经常在循环里出现,比如上面这个例子,这样会影响计算速度,最好的办法是预先定义a的长度,比 ...

  8. 第四节: Quartz.Net五大构件之Trigger通用用法(常用方法、优先级、与job关联等)

    一. 简介 1. 几个类型: ①:TriggerBuilder:用来创建ITrigger实例 ②:ITrigger:触发器实例 2.常用的几个方法 ①.StartNow:Trigger马上触发. ②. ...

  9. 使用select为描述符设置超时

    int readable_timeo(int fd, int sec) { fd_set rset; struct timeval tv; FD_ZERO(&rset); FD_SET(fd, ...

  10. webapp中绝对定位/固定定位与虚拟键盘冲突的问题

    $('body,html').height(document.body.clientHeight); 进入页面的时候就把高度固定住,这样虚拟键盘打开页面高度不会变化,你的布局也不会乱. 测试有效. 当 ...