1.把深度 和 子树大小 全部考虑到的树哈希,
LL hashx(int x, int fa, int dep) {
if (sz[x] == 1) return 1;
vector<LL > vs; LL ans = h[dep] % mod;
for(int i = head[x]; i; i = e[i].next) {
int y = e[i].y;
if (y == fa) continue;
vs.push_back(hashx(y, x, dep + 1));
}
sort(vs.begin(), vs.end()); LL now = 1, p = 0;
for(int i = 0; i < vs.size(); ++i)
p = (p + vs[i] * now % mod) % mod, now = now * 131 % mod;
return ans * p % mod;
}
h[x] = 9973^x % mod
2. 最小表示法
void dfs(int u,int fa)
{
int sum=0;
for(int i=head[u];i!=-1;i=nxt[i])
{
int v=to[i];
if(v!=fa)
dfs(v,u);
}
for(int i=head[u];i!=-1;i=nxt[i])
{
int v=to[i];
if(v!=fa)
{
p[++sum]=hash[v];
}
}
hash[u]='(';
sort(p+1,p+sum+1);
for(int i=1;i<=sum;++i)
hash[u]+=p[i];
hash[u]+=')';
}
标签:int,LL,最小,表示法,fa,vs,哈希,now,mod From: https://www.cnblogs.com/Alphaban/p/16800403.html