树同构模板
#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; }
没有人不辛苦,只有人不喊疼