4337: BJOI2015 树的同构

题目连接:

http://www.lydsy.com/JudgeOnline/problem.php?id=4337

Description

树是一种很常见的数据结构。

我们把N个点,N-1条边的连通无向图称为树。

若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树。

对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相

同,那么这两个树是同构的。也就是说,它们具有相同的形态。

现在,给你M个有根树,请你把它们按同构关系分成若干个等价类。

Input

第一行,一个整数M。

接下来M行,每行包含若干个整数,表示一个树。第一个整数N表示点数。接下来N

个整数,依次表示编号为1到N的每个点的父亲结点的编号。根节点父亲结点编号为0。

Output

输出M行,每行一个整数,表示与每个树同构的树的最小编号。

Sample Input

4

4 0 1 1 2

4 2 0 2 3

4 0 1 1 1

4 0 1 2 3

Sample Output

1

1

3

1

Hint

【样例解释】

编号为1, 2, 4 的树是同构的。编号为3 的树只与它自身同构。

100% 的数据中,1 ≤ N, M ≤ 50。

题意

题解

从树的重心开始hash,因为重心最多两个。

然后找到树的最小表示就好了。

代码

#include<bits/stdc++.h>
using namespace std; const int maxn = 555;
int f[maxn],son[maxn],n,mx;
vector<int>E[maxn];
string h[maxn],h2[maxn],ha[maxn];
void getroot(int x,int fa)
{
son[x]=1,f[x]=0;
for(int i=0;i<E[x].size();i++)
{
int p=E[x][i];
if(p==fa)continue;
getroot(p,x);
son[x]+=son[p];
f[x]=max(f[x],son[p]);
}
f[x]=max(f[x],n-son[x]);
mx=max(f[x],mx);
}
void init()
{
for(int i=1;i<=n;i++)E[i].clear();
mx=0;
memset(f,0,sizeof(f));
memset(son,0,sizeof(son));
}
void dfs(int x,int fa){
h[x]="(";
for(int i=0;i<E[x].size();i++){
int v = E[x][i];
if(v!=fa)dfs(v,x);
}
int now=0;
for(int i=0;i<E[x].size();i++){
int v = E[x][i];
if(v!=fa)
h2[now++]=h[v];
}
sort(h2,h2+now);
for(int i=0;i<now;i++)
h[x]+=h2[i];
h[x]+=")";
}
string get()
{
scanf("%d",&n);
init();
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
if(x){
E[x].push_back(i);
E[i].push_back(x);
}
}
getroot(1,0);
string tmp = "";
for(int i=1;i<=n;i++){
if(f[i]==mx)
{
dfs(i,0);
if(h[i]>tmp)tmp=h[i];
}
}
return tmp;
}
int main()
{
int q;scanf("%d",&q);
for(int i=1;i<=q;i++)
ha[i]=get();
for(int i=1;i<=q;i++){
for(int j=1;j<=i;j++){
if(ha[i]==ha[j]){
cout<<j<<endl;
break;
}
}
}
}

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

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

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

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

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

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

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

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

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

  5. [BJOI2015]树的同构 && 树哈希教程

    题目链接 有根树的哈希 离散数学中对树哈希的描述在这里.大家可以看看. 判断有根树是否同构,可以考虑将有根树编码.而编码过程中,要求保留树形态的特征,同时忽略子树顺序的不同.先来看一看这个方法: 不妨 ...

  6. BZOJ4337 树的同构 (树哈希)(未完成)

    样例迷,没过 交了30pts #include <cstdio> #include <iostream> #include <cstring> #include & ...

  7. bzoj 4337 树的同构

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

  8. 4337: BJOI2015 树的同构

    题解: 树的同构的判定 有根树从根开始进行树hash 先把儿子的f进行排序 $f[i]=\sum_{j=1}^{k} { f[j]*prime[j]} +num[i]$(我没有仔细想这样是不是树是唯一 ...

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

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

随机推荐

  1. MQ安装配置

        (1)执行接受许可脚本: ./mqlicense.sh –accept  (2) 安装 WebSphere MQ for Linux 服务器: [root@localhost mq]# rpm ...

  2. DM9000网卡驱动接受数据从中断方式改成NAPI方式小记

    平台是最最经典的s3c2440了,说了要做这件事情很久了,就是改几行代码,一直没有做.前几天逼了自己一下,终于给做了,拖延症患者伤不起. 以下是需要读者对napi机制有所熟悉: step1:在boar ...

  3. Webpack使用教程二

    Webpack提供了很多的命令选项来帮助用户构建应用,如果只是通过命令行来使用这些选项,会显得不方便.为了更好的使用Webpack提供的各种命令选项,我们可以创建一个webpack.config.js ...

  4. 利用扩展事件(Xevents)捕捉高消耗查询

    生产环境中有时需要使用者抓取一些特定的语句分析,如超超长查询,或高IO查询等.一般来说大家对跟踪比较熟悉,主要因为其有完善的UI支持.由于扩展事件在sql2012才提供UI支持,所以虽然在08时就已经 ...

  5. EJDB 1.1.18 发布,嵌入式JSON数据库

    EJDB 1.1.18 增加对 MongoDB 操作符 $and 和 $or 的支持,支持 MongoDB 的 $ 推断操作符,修复了 $fields 提示的bug,提升了查询处理的性能. EJDB ...

  6. Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用

    一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见   function setTabVisableByName( ...

  7. JWT【JSON Web Token】 简述

    draft: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html http://tools.ietf.org/html/ ...

  8. 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。

    之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...

  9. [matlab] MATLAB 界面编程 傻瓜教程

    >_<:在 MATLAB 的命令窗口(Command Window)中运行 guide 命令,来打开 GUIDE 界面,如下: >_<:然后,选择空模板(Blang GUI), ...

  10. iis6.0报以下的错。。

    Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec8 ...