洛谷p5043 树同构/树哈希
前置知识:哈希
#include<bits/stdc++.h> using namespace std; int head[100000],ans[1000][1000],cnt,n,m; struct node{ int next,to; }e[1000000]; void add(int from,int to){ e[++cnt].next=head[from]; e[cnt].to=to; head[from]=cnt; } long long hhash(int from,int fa){ long long tot=0,q[10000],ans=0; for(int i=head[from];i;i=e[i].next){ int to=e[i].to; if(to==fa)continue; q[++tot]=hhash(to,from); } sort(q+1,q+1+tot); for(int i=1;i<=tot;i++){ ans=ans*2333+q[i]; } return ans*2333+1001; } int main(){ scanf("%d",&m); for(int i=1;i<=m;i++){ cnt=0; scanf("%d",&n); memset(head,0,sizeof head); for(int j=1;j<=n;j++){ int x; scanf("%d",&x); if(x==0)continue; add(j,x); add(x,j); } for(int j=1;j<=n;j++){ ans[i][j]=hhash(j,0); } sort(ans[i]+1,ans[i]+1+n); for(int j=1,k=0;j<=i;j++){ while(k<=n){ if(ans[i][++k]!=ans[j][k]){ break; } } if(k>n){ printf("%d\n",j); break; } } } }
注意 树同构是无根树 所以要以每个点为根做一次哈希 排序后跟其他树比