树hash啊

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

然后用重心去作为根遍历

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

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

其实

先把新的树建出来不好吗

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int _=1e2;
const int maxn=1e4+_;
const int maxt=+; const LL hbase=; LL mi[maxn];
void hyu(){mi[]=;for(int i=;i<maxn;i++)mi[i]=mi[i-]*hbase;} struct TREE
{
int id,ptt;
TREE(){ptt=;}
struct node
{
int x,y,next;
}a[*maxn];int len,last[maxn],du[maxn];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len; du[x]++;
if(du[x]==)ptt++;
else if(du[x]==)ptt--;
} //---------------------------------def-------------------------------------------- int tot[maxn];
void dfs(int x,int fr)
{
if(du[x]==)tot[x]=;
else tot[x]=;
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)dfs(a[k].y,x),tot[x]+=tot[a[k].y];
}
int G[maxn];
void getrt(int x,int fr)
{
G[x]=;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
G[x]=max(G[x],tot[y]);
if(y!=fr)
{
tot[x]-=tot[y];
tot[y]+=tot[x];
getrt(y,x);
tot[y]-=tot[x];
tot[x]+=tot[y];
}
}
} //----------------------------------getrt-------------------------------------------- int num;LL THash[];
LL h[maxn]; int tlen; LL tt[maxn];
void gethash(int x,int fr)
{
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)gethash(a[k].y,x);
tlen=;
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)tt[++tlen]=h[a[k].y]; if(tlen==)h[x]=;
else
{
sort(tt+,tt+tlen+);
h[x]=(tlen-)*;
for(int i=;i<=tlen;i++)h[x]+=tt[i]*mi[i-];
}
} //---------------------------------gethash------------------------------------------- void main()
{
int n,x,y;
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(x,y),ins(y,x);
}
ptt=n-ptt; dfs(,),getrt(,);
num=;
int mn=(<<);
for(int i=;i<=n;i++)
if(du[i]!=)mn=min(mn,G[i]);
for(int i=;i<=n;i++)
if(mn==G[i])
gethash(i,),THash[num++]=h[i];
}
}tr[maxt];
bool check(int x,int y)
{
for(int i=;i<tr[x].num;i++)
for(int j=;j<tr[y].num;j++)
if(tr[x].THash[i]==tr[y].THash[j])return true;
return false;
} int aslen,as[maxt];
bool cmp(int x,int y){return tr[x].ptt<tr[y].ptt;}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int m;
scanf("%d",&m);hyu();
for(int i=;i<=m;i++)
tr[i].id=i,tr[i].main();
for(int i=;i<=m;i++)
{
bool bk=false;
for(int j=;j<=aslen;j++)
if(check(i,as[j])){bk=true;break;}
if(!bk)as[++aslen]=i;
}
sort(as+,as+aslen+,cmp);
printf("%d\n",aslen);
for(int i=;i<aslen;i++)printf("%d ",tr[as[i]].ptt);
printf("%d\n",tr[as[aslen]].ptt); return ;
}

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. SPOJ GSS系列(数据结构维护技巧入门)

    题目链接 GSS $GSS1$ 对于每个询问$l$, $r$,查询$a_{l}$, $a_{l+1}$, $a_{l+2}$, ..., $a_{r}$这个序列的最大字段和. 建立线段树,每个节点维护 ...

  2. Java爬虫系列二:使用HttpClient抓取页面HTML

    爬虫要想爬取需要的信息,首先第一步就要抓取到页面html内容,然后对html进行分析,获取想要的内容.上一篇随笔<Java爬虫系列一:写在开始前>中提到了HttpClient可以抓取页面内 ...

  3. webstrom配置一键修复ESLint的报错

    因为项目本身有用eslint,而我这边没用,我这边提交上去别人update后就会提示很多eslint的格式错误提示,所以就在该项目里使用了eslint. 发现一般有两种安装方式,我使用的是webstr ...

  4. spring mvc 编写处理带参数的Controller

    在上一随笔记录的基础上,现记录编写处理带有参数的Controller. @Controller //这个注解会告知<context:component:scan> 将HomeControl ...

  5. XSY1036 [Apio2012]派遣

    题面 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个 ...

  6. iOS -- SKViedoNode类

    SKViedoNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) ...

  7. git extensions远程配置

    http://blog.csdn.net/pgmsoul/article/details/7860393 远程地址是如下格式:git@github.com:yaoname/project.git 保存 ...

  8. Android记录24-WebView实现白天/夜间阅读模式

    前言 本篇博客给大家分享一个WebView的使用案例.实现Android调用JavaScript代码来控制白天/夜间模式. 关于WebView怎样使用,官网有非常好的说明,Building Web A ...

  9. caffe训练自己的图片进行分类预测--windows平台

    caffe训练自己的图片进行分类预测 标签: caffe预测 2017-03-08 21:17 273人阅读 评论(0) 收藏 举报  分类: caffe之旅(4)  版权声明:本文为博主原创文章,未 ...

  10. 游戏开发之基础图像---3d图像处理

    http://dev.gameres.com/Program/Visual/3D/3Darit.htm float 类型数据有效数字是小数点后面6位 单精度 doluble 类型数据是至少10位,双精 ...