树hash啊

我的做法很垃圾,就是yy一种只有一个孩子时hash值和孩子一样的hash法

然后用重心去作为根遍历

这样有点问题,就是重心假如也是要删掉的那就gg了

那我们求tot的时候删掉的点就不管直接设为0,求重心的时候也不管这些删掉的点就可以了

其实

先把新的树建出来不好吗

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. typedef long long LL;
  9. const int _=1e2;
  10. const int maxn=1e4+_;
  11. const int maxt=+;
  12.  
  13. const LL hbase=; LL mi[maxn];
  14. void hyu(){mi[]=;for(int i=;i<maxn;i++)mi[i]=mi[i-]*hbase;}
  15.  
  16. struct TREE
  17. {
  18. int id,ptt;
  19. TREE(){ptt=;}
  20. struct node
  21. {
  22. int x,y,next;
  23. }a[*maxn];int len,last[maxn],du[maxn];
  24. void ins(int x,int y)
  25. {
  26. len++;
  27. a[len].x=x;a[len].y=y;
  28. a[len].next=last[x];last[x]=len;
  29.  
  30. du[x]++;
  31. if(du[x]==)ptt++;
  32. else if(du[x]==)ptt--;
  33. }
  34.  
  35. //---------------------------------def--------------------------------------------
  36.  
  37. int tot[maxn];
  38. void dfs(int x,int fr)
  39. {
  40. if(du[x]==)tot[x]=;
  41. else tot[x]=;
  42. for(int k=last[x];k;k=a[k].next)
  43. if(a[k].y!=fr)dfs(a[k].y,x),tot[x]+=tot[a[k].y];
  44. }
  45. int G[maxn];
  46. void getrt(int x,int fr)
  47. {
  48. G[x]=;
  49. for(int k=last[x];k;k=a[k].next)
  50. {
  51. int y=a[k].y;
  52. G[x]=max(G[x],tot[y]);
  53. if(y!=fr)
  54. {
  55. tot[x]-=tot[y];
  56. tot[y]+=tot[x];
  57. getrt(y,x);
  58. tot[y]-=tot[x];
  59. tot[x]+=tot[y];
  60. }
  61. }
  62. }
  63.  
  64. //----------------------------------getrt--------------------------------------------
  65.  
  66. int num;LL THash[];
  67. LL h[maxn]; int tlen; LL tt[maxn];
  68. void gethash(int x,int fr)
  69. {
  70. for(int k=last[x];k;k=a[k].next)
  71. if(a[k].y!=fr)gethash(a[k].y,x);
  72. tlen=;
  73. for(int k=last[x];k;k=a[k].next)
  74. if(a[k].y!=fr)tt[++tlen]=h[a[k].y];
  75.  
  76. if(tlen==)h[x]=;
  77. else
  78. {
  79. sort(tt+,tt+tlen+);
  80. h[x]=(tlen-)*;
  81. for(int i=;i<=tlen;i++)h[x]+=tt[i]*mi[i-];
  82. }
  83. }
  84.  
  85. //---------------------------------gethash-------------------------------------------
  86.  
  87. void main()
  88. {
  89. int n,x,y;
  90. scanf("%d",&n);
  91. for(int i=;i<n;i++)
  92. {
  93. scanf("%d%d",&x,&y);
  94. ins(x,y),ins(y,x);
  95. }
  96. ptt=n-ptt;
  97.  
  98. dfs(,),getrt(,);
  99. num=;
  100. int mn=(<<);
  101. for(int i=;i<=n;i++)
  102. if(du[i]!=)mn=min(mn,G[i]);
  103. for(int i=;i<=n;i++)
  104. if(mn==G[i])
  105. gethash(i,),THash[num++]=h[i];
  106. }
  107. }tr[maxt];
  108. bool check(int x,int y)
  109. {
  110. for(int i=;i<tr[x].num;i++)
  111. for(int j=;j<tr[y].num;j++)
  112. if(tr[x].THash[i]==tr[y].THash[j])return true;
  113. return false;
  114. }
  115.  
  116. int aslen,as[maxt];
  117. bool cmp(int x,int y){return tr[x].ptt<tr[y].ptt;}
  118. int main()
  119. {
  120. freopen("a.in","r",stdin);
  121. freopen("a.out","w",stdout);
  122. int m;
  123. scanf("%d",&m);hyu();
  124. for(int i=;i<=m;i++)
  125. tr[i].id=i,tr[i].main();
  126. for(int i=;i<=m;i++)
  127. {
  128. bool bk=false;
  129. for(int j=;j<=aslen;j++)
  130. if(check(i,as[j])){bk=true;break;}
  131. if(!bk)as[++aslen]=i;
  132. }
  133. sort(as+,as+aslen+,cmp);
  134. printf("%d\n",aslen);
  135. for(int i=;i<aslen;i++)printf("%d ",tr[as[i]].ptt);
  136. printf("%d\n",tr[as[aslen]].ptt);
  137.  
  138. return ;
  139. }

bzoj4474: [Jsoi2015]isomorphism的更多相关文章

  1. 【BZOJ4474】isomorphism(树的同构,哈希)

    题意:一个无向树的度数为 2的结点称为假结点,其它结点称为真结点.一个无向树的简化树其结点由原树的全体真结点组成,两个真结点之间有边当且仅当它们在原树中有边,或者在原树中有一条联结这两个结点的路,其中 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 「JSOI2015」isomorphism

    「JSOI2015」isomorphism 传送门 我们还是考虑树哈希来判同构. 但是我们需要使用一些特殊的手段来特殊对待假节点. 由于是无向树,我们首先求出重心,然后以重心为根跑树哈希. 此处我们不 ...

  4. JSOI2015 Round1——完挂

    感觉眼前天地转了转…… Day 0 和zxy,zyh一同坐车去扬中,同行的还有llr 路上zyh基本在睡觉…… 入住的宾馆各种坑爹,同一层住的两个房间一个有网一个没网 我有幸入住了有网的房间,zyh在 ...

  5. BZOJ1478 Sgu282 Isomorphism

    Problem A: Sgu282 Isomorphism Time Limit: 15 Sec  Memory Limit: 64 MBSubmit: 172  Solved: 88[Submit] ...

  6. bzoj4487[Jsoi2015]染色问题 容斥+组合

    4487: [Jsoi2015]染色问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 127[Submit][Status ...

  7. BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列

    BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...

  8. Isomorphism 同构

    小结: 1.两个有限维度的向量空间,在同一数域下,是同构的 等价于 它们维数相等. Isomorphism 同构 0.1.8 Isomorphism. If U and V are vector sp ...

  9. 【BZOJ4477】[JSOI2015]字符串树(Trie树)

    [BZOJ4477][JSOI2015]字符串树(Trie树) 题面 BZOJ 题解 对于每个点维护其到根节点的所有字符串构成的\(Trie\),显然可持久化一下就很好写了. 然后每次询问就是\(u+ ...

随机推荐

  1. LibieOJ 6170 字母树 (Trie)

    题目链接 字母树 (以每个点为根遍历,插入到trie中,统计答案即可)——SamZhang #include <bits/stdc++.h> using namespace std; #d ...

  2. 洛谷——P2919 [USACO08NOV]守护农场Guarding the Farm

    P2919 [USACO08NOV]守护农场Guarding the Farm 题目描述 The farm has many hills upon which Farmer John would li ...

  3. java三角形和菱形的打印

    一.三角形的打印 package 向家康; import java.util.Scanner; public class Main { public void san(int num) { for(i ...

  4. sqlalchemy如何实现时间列自动更新?

    目标:数据表的时间列在其他列内容更新的时候,自动更新时间列到更新的时间 方法:数据库表模型如下:server_default表示初始时间,onupdate表示更新的时间 class MonitorDa ...

  5. paramiko执行命令超时的问题

    问题:paramiko远程执行命令,需要等到命令返回信息,如果命令执行时间比较长,返回信息就需要等很久 方案:1.使用nohup + 待执行命令 + & ,使用后台执行的方式,应该可以快速返回 ...

  6. Android基础新手教程——3.7 AnsyncTask异步任务

    Android基础新手教程--3.7 AnsyncTask异步任务 标签(空格分隔): Android基础新手教程 本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务 ...

  7. CSS规则的优先级匹配

    CSS规则之间能够互相覆盖.这一点我们应该已经习以为常了.然而正是因为规则之间能够互相覆盖.子元素继承父元素的默认行为,导致了CSS冲突的问题. 碰到CSS冲突时.通常我们会增加一些更加具体的规则来明 ...

  8. window.open 打开子窗体,关闭全部的子窗体

    需求:通过window.open方法打开了子窗体,当关闭主窗体时.子窗体应当也关闭. 实现思路: 1.打开子窗体函数window.open(url,winName)的第二个參数winName能够唯一标 ...

  9. php自定义错误

    function myErrorHandler ( $errno , $errstr , $errfile , $errline ) { if (!( error_reporting () & ...

  10. Java集合01----ArrayList的遍历方式及应用

                                                 Java集合01----ArrayList的遍历方式及应用 前面已经学习了ArrayList的源代码,为了学以 ...