uva12489 Combating cancer(树同构)】的更多相关文章

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3933 给你两棵无根树,让你判断这两棵树是否同构 不会判断树同构,果断抄了个模板,乱搞给过掉了. 首先由于给的是无根树,而要判断无根树是否同构得以重心为根,然后做一个括号序列…
题意 题目链接 Sol 树的同构问题,直接拿hash判一下,具体流程大概是这样的: 首先转化为有根树,预处理出第\(i\)棵树以\(j\)为根时的hash值. 那么两个树同构当且仅当把两棵树的hash数组排完序后完全一致(感性理解一下) /* */ #include<bits/stdc++.h> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #define se secon…
BZOJ 4337 简单记录一种树哈希的方法:以$x$为根的子树的哈希值为$\sum_{y \in son(x)}f_y*base_i$,$f_y$表示以$y$为根的树的哈希值,其中$i$表示$f_y$在若干个儿子中的排名,$base$是$rand$出的对一个质数取模之后的很大的数. 对于本题这样的情况,可以每一个结点都拿出来作为根计算一下,然后再把所有的结果排个序,如果两棵树同构那么排序之后得到的序列一定是一样的. 时间复杂度$O(n^3)$. Code: #include <cstdio>…
Andrew and Chemistry Description During the chemistry lesson Andrew learned that the saturated hydrocarbons (alkanes) enter into radical chlorination reaction. Andrew is a very curious boy, so he wondered how many different products of the reaction m…
题意:给定一棵n个点的树,问删去某个点之后所有的树同构,这样分割出来的树最多能有几棵 n<=4000 思路:分割成至少两个size相等的联通块之后size必定小于n/2,与树的重心的定义相同 预处理出重心(0,1或2个)之后上无根树同构板子 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull;…
LINK:模板 树同构 题目说的很迷 给了一棵有根树 但是重新标号 言外之意还是一棵无根树 然后要求判断是否重构. 由于时无根的 所以一个比较显然的想法暴力枚举根. 然后做树hash或者树的最小表示法. 前者做一次时n^2logn的 而后者则是严格的n^2logn的. 这样加上暴力枚举根就是n^3logn了. 最后我们将这些东西再sort一下和其他的树做对比 如果所有的都完全一致那么说明时同构的. 算法正确性 首先完全一样的树 再做树hash或者最小表示法时 得到的东西必然一样. 这个可以利用递…
[BZOJ3197][Sdoi2013]assassin Description Input Output Sample Input 4 1 2 2 3 3 4 0 0 1 1 1 0 0 0 Sample Output 1 HINT 题意:给你两棵同构的树,每个节点都有权值0/1,现在想改变第一棵树中部分点的权值,使得两棵树对应的节点权值相同,问最少改变多少节点. 题解:先考虑树hash+树形DP.树hash的方法同独钓寒江雪.设f[x][y]表示第一棵树中的x节点与第二棵树中的y节点对应时,…
[BZOJ3162]独钓寒江雪 题解:先进行树hash,方法是找重心,如果重心有两个,则新建一个虚点将两个重心连起来,新点即为新树的重心.将重心当做根进行hash,hash函数不能太简单,我的方法是:将x的所有儿子的hash值排序,然后将这些hash值立方合在一起作为x的hash值. 进行完树hash后,我们考虑DP.首先不考虑同构,设f[0/1][x]表示选(不选)x时,在x的子树中选出独立集的方案数,则有 $f[0][x]=\prod f[1][y]+f[0][y]\\f[1][x]=\pr…
Regular Forestation \[ Time Limit: 1000 ms\quad Memory Limit: 262144 kB \] 题意 给出一个节点为 \(n\) 的树,问删掉树上的一个点和这个点相连的边以后,剩下的子树是不是都是同构的. 思路 首先删掉的这个点一定是这棵树的重心,而且一棵树的重点至多只会有两个. 那么就暴力枚举判断删掉这棵树的重心,然后对于剩下的子树去判断是否是同构的. 判断两棵树是否是同构的,也是先找出重心,然后从重心开始,用进某个节点为 \(0\) 表示…
题意: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1T1的所有点重新标号,使得树T1和树T2完全相同,那么这两个树是同构的.也就是说,它们具有相同的形态. 现在,给你M个有根树,请你把它们按同构关系分成若干个等价类. n,m<=50 思路:无根树同构,直接上哈希板子 BZOJ上没有C++11被搞了 #include<bits/stdc++.h>…