nodgd家里种了一棵树,有一天nodgd比较无聊,就把这棵树画在了一张纸上。另一天nodgd更无聊,就又画了一张。
这时nodgd发现,两次画的顺序是不一样的,这就导致了原本的某一个节点u0在第一幅图中编号为u1,在第二副图中编号为u2。
于是,nodgd决定检查一下他画出的两棵树到底是不是一样的。nodgd已经给每棵树的节点都从1到u进行了编号,即每棵树有n个节点。
这时nodgd发现,两次画的顺序是不一样的,这就导致了原本的某一个节点u0在第一幅图中编号为u1,在第二副图中编号为u2。
于是,nodgd决定检查一下他画出的两棵树到底是不是一样的。nodgd已经给每棵树的节点都从1到u进行了编号,即每棵树有n个节点。
如果存在一个1到n的排列p1p2…pn,对于第一幅图中的任意一条边(u,v),在第二幅图中都能找到一条边(pu,pv),则认为这两幅图中的树是一样的。
又是一道树同构啊,今年第一篇文章就写了这个啊
见题秒,but,求p数组的时候写挂了。。。
简单说一下,基本思想就是对树的括号序列求rabin-karp
这里是无根树所以可以选出树的重心做根
让后对所有子树排序后跑一次dfs序,记为a和b,那么就有p[a[i]]=b[i]
让后?没有了啊
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
using namespace std;
LL