树同构模板

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
const int N=5e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
int m,n;
int h[105],ne[105],e[105],idx;
ll f[105][105];
int in[105];
ll ans[105];
int base=997;
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa){
    ans[u]=1;
    int i;
    ll t[105];
    int id=0;
    for(i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        if(j==fa)
            continue;
        dfs(j,u);
        t[++id]=ans[j];
    }
    sort(t+1,t+1+id);
    for(i=1;i<=id;i++)
        ans[u]=(ans[u]*base+t[i])%mod;
}
int main(){
    ios::sync_with_stdio(false);
    cin>>m;
    int i;
    for(i=1;i<=m;i++){
        cin>>n;
        in[i]=n;
        for(int j=0;j<=n;j++)
            h[j]=-1;
        idx=0;
        for(int j=1;j<=n;j++){
            int x;
            cin>>x;
            if(x){
                add(x,j);
                add(j,x);
            }
        }
        for(int j=1;j<=n;j++){
            dfs(j,-1);
            f[i][j]=ans[j];
        }
        sort(f[i]+1,f[i]+1+n);
    }
    for(i=1;i<=m;i++){
        for(int j=1;j<=i;j++){
            if(in[i]==in[j]){
                int k;
                for(k=1;k<=in[i];k++){
                    if(f[i][k]!=f[j][k])
                        break;
                }
                if(k>in[i]){
                    cout<<j<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}
View Code

 

posted @ 2020-08-30 21:30  朝暮不思  阅读(127)  评论(0编辑  收藏  举报