【CodeForces - 1252F】:Regular Forestation【树的同构】

博客探讨了CodeForces上的Regular Forestation问题,涉及树的同构概念。文章介绍了两种判断树同构的方法——最小表示法和树哈希,并详细解释了有根树的最小表示法。博主分析了问题的解决方案,指出要找的那个点移除后,子树同构且大小相同。提供了使用树哈希的代码实现。
摘要由CSDN通过智能技术生成

题目:

CodeForces - 1252F:Regular Forestation

题意:

给定一颗树,你需要找到一个点,移除这个点后,剩下的子树都是同构的

笔记:

判定树是否同构,有两种方法,一是树的最小表示法,二是树哈希,最小表示法的时间空间都比较大,数据小时适用

有根树的最小表示法:

对树跑一遍括号序列,叶子节点的括号序列就是“()”,非叶子节点,先对儿子节点的括号序列从小到大排序,它的括号序列就是“(son1son2son3)”,排序就是为了让子树绕着父亲节点旋转

 如果是无根树,可以先找到这颗树的重心,把重心当作根跑一遍最小表示法即可;而树的重心可能有两个,而以两个不同的重心跑出来的最小表示法可能不一样,所以就要以两个重心为根跑两边

树哈希见 OI - Wiki

分析:

(1)这个题先跑一遍树形dp找到那个可移除的点,移除这个点后剩下的子树的 size 都是一样的,所以这个点一定是唯一的,然后就判断剩下的子树是否同构即可

代码:

#include <bits/stdc++.h>
 
using namespace std;
const int maxn = 1e5+15;
struct edge{
    int to,nxt;
}e[maxn<<1];
int n,u,v,cnt,head[maxn],d[maxn];
inline void add(int u,int v){
    e[++cnt] = (edge){v,head[u]};
    head[u] = cnt;
}
int dp[maxn],root,sz;
void dfs(int x,int fa){
    int sum = -1; dp[x] = 1; bool flag = true;
    for(int i = head[x]; i > 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值