洛谷p5043 树同构/树哈希

时间:2019-10-31
本文章向大家介绍洛谷p5043 树同构/树哈希,主要包括洛谷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;
            }
        }
    }
}

注意 树同构是无根树 所以要以每个点为根做一次哈希 排序后跟其他树比

原文地址:https://www.cnblogs.com/passione-123456/p/11771905.html