4337: BJOI2015 树的同构
题解:
树的同构的判定
有根树从根开始进行树hash
先把儿子的f进行排序
$f[i]=\sum_{j=1}^{k} { f[j]*prime[j]} +num[i]$(我没有仔细想这样是不是树是唯一的。。。反正过了)
无根树先找到重心再作为根
因为重心最多只有两个,复杂度仍旧O(n)
代码:
- #include <bits/stdc++.h>
- using namespace std;
- #define rint register int
- #define IL inline
- #define rep(i,h,t) for (int i=h;i<=t;i++)
- #define dep(i,t,h) for (int i=t;i>=h;i--)
- #define me(x) memset(x,0,sizeof(x))
- #define ll long long
- #define mep(x,y) memcpy(x,y,sizeof(y))
- #define mid ((h+t)>>1)
- #define ull unsigned ll
- namespace IO{
- char ss[<<],*A=ss,*B=ss;
- IL char gc()
- {
- return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
- }
- template<class T>void read(T &x)
- {
- rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
- while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
- }
- char sr[<<],z[]; int Z,C=-;
- template<class T>void wer(T x)
- {
- if (x<) sr[++C]='-',x=-x;
- while (z[++Z]=x%+,x/=);
- while (sr[++C]=z[Z],--Z);
- }
- IL void wer1() { sr[++C]=' ';}
- IL void wer2() { sr[++C]='\n';}
- template<class T>IL void maxa(T &x,T y) { if (x<y) x=y;}
- template<class T>IL void mina(T &x,T y) { if (x>y) x=y;}
- template<class T>IL T MAX(T x,T y) {return x>y?x:y;}
- template<class T>IL T MIN(T x,T y) {return x<y?x:y;}
- };
- using namespace IO;
- const int N=;
- int head[N],n,m,l,num[N],f[N];
- struct re{
- int a,b;
- }e[N*];
- bool q[];
- int zs[N];
- ull son[N][N],ans[N],g[N];
- IL void arr(int x,int y)
- {
- e[++l].a=head[x];
- e[l].b=y;
- head[x]=l;
- }
- void fdrt(int x,int y)
- {
- num[x]=;
- for (rint u=head[x];u;u=e[u].a)
- {
- int v=e[u].b;
- if (v!=y)
- {
- fdrt(v,x);
- num[x]+=num[v];
- if (num[v]>f[x]) f[x]=num[v];
- }
- }
- if (n-num[x]>f[x]) f[x]=n-num[x];
- }
- void dfs(int x,int y)
- {
- num[x]=;
- int cnt=;
- for (rint u=head[x];u;u=e[u].a)
- {
- int v=e[u].b;
- if (v!=y)
- {
- dfs(v,x);
- son[x][++cnt]=g[v];
- num[x]+=num[v];
- }
- }
- sort(son[x]+,son[x]+cnt+);
- ull now=;
- rep(i,,cnt) now=now+son[x][i]*zs[i];
- now+=num[x];
- g[x]=now;
- }
- int main()
- {
- freopen("1.in","r",stdin);
- freopen("1.out","w",stdout);
- read(m);
- rep(i,,)
- for (int j=;j*i<=;j++)
- q[i*j]=;
- int cnt=;
- rep(i,,)
- if (!q[i])
- {
- zs[++cnt]=i;
- if (cnt>=) break;
- }
- rep(j,,m)
- {
- me(head); read(n); me(f); l=;
- rep(i,,n)
- {
- int x,y; read(x);
- if (x) arr(x,i),arr(i,x);
- }
- fdrt(,);
- int ma=1e9;
- rep(i,,n) ma=min(ma,f[i]);
- rep(i,,n)
- if (f[i]==ma)
- {
- dfs(i,); maxa(ans[j],g[i]);
- }
- }
- rep(i,,m)
- rep(j,,m)
- if(ans[j]==ans[i])
- {
- cout<<j<<endl; break;
- }
- return ;
- }
4337: BJOI2015 树的同构的更多相关文章
- BZOJ 4337: BJOI2015 树的同构 树hash
4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...
- BZOJ.4337.[BJOI2015]树的同构(树哈希)
BZOJ 洛谷 \(Description\) 给定\(n\)棵无根树.对每棵树,输出与它同构的树的最小编号. \(n及每棵树的点数\leq 50\). \(Solution\) 对于一棵无根树,它的 ...
- [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1023 Solved: 436[Submit][Status ...
- bzoj4337: BJOI2015 树的同构 树哈希判同构
题目链接 bzoj4337: BJOI2015 树的同构 题解 树哈希的一种方法 对于每各节点的哈希值为hash[x] = hash[sonk[x]] * p[k]; p为素数表 代码 #includ ...
- 【BZOJ4337】BJOI2015 树的同构 括号序列
[BZOJ4337]BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱 ...
- BZOJ4337:[BJOI2015]树的同构——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4337 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根, ...
- [BJOI2015]树的同构
嘟嘟嘟 判断树的同构的方法就是树上哈希. 如果树是一棵有根树,那么只要从根节点出发dfs,每一个节点的哈希值等于按传统方式算出来的子树的哈希值的结果.需要注意的是,算完子树的哈希值后要先排序再加起来, ...
- BZOJ4337:[BJOI2015]树的同构(树hash)
Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如 ...
- Luogu 5043 【模板】树同构([BJOI2015]树的同构)
BZOJ 4337 简单记录一种树哈希的方法:以$x$为根的子树的哈希值为$\sum_{y \in son(x)}f_y*base_i$,$f_y$表示以$y$为根的树的哈希值,其中$i$表示$f_y ...
随机推荐
- nginx(二)nginx的安装
下载 nginx官网下载地址 把源码解压缩之后,在终端里运行如下命令: ./configure make make install 默认情况下,Nginx 会被安装在 /usr/local/nginx ...
- Kubernetes从懵圈到熟练:读懂这一篇,集群节点不下线
排查完全陌生的问题,完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战.今天借这篇文章,跟大家分析一例这样的问题.排查过程中,需要理解一些自己完全陌生的组件,比如systemd和dbus. ...
- java 11 不可修改集合API
不可修改集合API 自 Java 9 开始,Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别. 示例1: ...
- boost库在windows上的安装
下载源码boost_1_70_0.zip 1.cmd进入boost源码包,运行bootstrap.bat生成bjam.exe 2.运行bjam.exe搞定 在visual studio配置 1. 项目 ...
- Mybatis的应用2 使用mybits+SpringBoot完成第一个查询的demo(随后加增加,更新,删除)
首先在mapper下面新建一个mysql.xml mysql.xml <?xml version="1.0" encoding="UTF-8" ?> ...
- 更换gcc工具链
title: 更换gcc工具链 date: 2019/1/16 19:27:51 toc: true --- 更换gcc工具链 下载后解压到一个临时目录先看看文件结构 mkdir tmp tar xj ...
- matlab运行出现“变量似乎会随着迭代次数改变而变化,请预分配内存,以提高运行速度”问题
这句话大致意思就是: b = 0;for i = 1:3 a(i) = b;end是说变量的长度是变化的,经常在循环里出现,比如上面这个例子,这样会影响计算速度,最好的办法是预先定义a的长度,比 ...
- 第四节: Quartz.Net五大构件之Trigger通用用法(常用方法、优先级、与job关联等)
一. 简介 1. 几个类型: ①:TriggerBuilder:用来创建ITrigger实例 ②:ITrigger:触发器实例 2.常用的几个方法 ①.StartNow:Trigger马上触发. ②. ...
- 使用select为描述符设置超时
int readable_timeo(int fd, int sec) { fd_set rset; struct timeval tv; FD_ZERO(&rset); FD_SET(fd, ...
- webapp中绝对定位/固定定位与虚拟键盘冲突的问题
$('body,html').height(document.body.clientHeight); 进入页面的时候就把高度固定住,这样虚拟键盘打开页面高度不会变化,你的布局也不会乱. 测试有效. 当 ...