首先树同构我是写过的……就是BJOI那题
然后图同构我是不会的……
然后就花了点头盾看了题解。
原来和树Hash差不多,只要进行迭代就好了
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=4005,N=205;
const long long P1=808080808080803ll,P2=888888888888887ll;
int n,m,hA[N],hB[N],enA,enB,test;
long long valA_1[N],valB_1[N],valA_2[N],valB_2[N],tmp1[N],tmp2[N],Vt1[N],Vt2[N];
struct Edge{
int b,next;
}eA[M<<1],eB[M<<1];
void AddEdgeA(int sa,int sb){
eA[++enA].b=sb;
eA[enA].next=hA[sa];
hA[sa]=enA;
}
void AddEdgeB(int sa,int sb){
eB[++enB].b=sb;
eB[enB].next=hB[sa];
hB[sa]=enB;
}
void Solve_A(){
for(int i=1;i<=n;i++){
int cnt=0;
for(int j=hA[i];j;j=eA[j].next){
int v=eA[j].b;cnt++;
tmp1[cnt]=valA_1[v];
tmp2[cnt]=valA_2[v];
}
sort(tmp1+1,tmp1+cnt+1);
sort(tmp2+1,tmp2+cnt+1);
long long Ha1=0,Ha2=0;
for(int j=1;j<=cnt;j++){Ha1=(Ha1*233ll+tmp1[j])%P1;Ha2=(Ha2*666ll+tmp2[j])%P2;}
Vt1[i]=Ha1;Vt2[i]=Ha2;
}
for(int i=1;i<=n;i++){valA_1[i]=Vt1[i];valA_2[i]=Vt2[i];}
}
void Solve_B(){
for(int i=1;i<=n;i++){
int cnt=0;
for(int j=hB[i];j;j=eB[j].next){
int v=eB[j].b;cnt++;
tmp1[cnt]=valB_1[v];
tmp2[cnt]=valB_2[v];
}
sort(tmp1+1,tmp1+cnt+1);
sort(tmp2+1,tmp2+cnt+1);
long long Ha1=0,Ha2=0;
for(int j=1;j<=cnt;j++){Ha1=(Ha1*233ll+tmp1[j])%P1;Ha2=(Ha2*666ll+tmp2[j])%P2;}
Vt1[i]=Ha1;Vt2[i]=Ha2;
}
for(int i=1;i<=n;i++){valB_1[i]=Vt1[i];valB_2[i]=Vt2[i];}
}
void Solve(){
scanf("%d %d",&n,&m);
memset(hA,0,sizeof(hA));
memset(hB,0,sizeof(hB));
enA=0;enB=0;
for(int i=1;i<=m;i++){
int u,v;
scanf("%d %d",&u,&v);
AddEdgeA(u,v);AddEdgeA(v,u);
}
for(int i=1;i<=m;i++){
int u,v;
scanf("%d %d",&u,&v);
AddEdgeB(u,v);AddEdgeB(v,u);
}
for(int i=1;i<=n;i++)valA_1[i]=valA_2[i]=valB_1[i]=valB_2[i]=1;
for(int i=1;i<=n;i++)Solve_A();
for(int i=1;i<=n;i++)Solve_B();
sort(valA_1+1,valA_1+n+1);
sort(valA_2+1,valA_2+n+1);
sort(valB_1+1,valB_1+n+1);
sort(valB_2+1,valB_2+n+1);
int flag=1;
for(int i=1;i<=n;i++)if(valA_1[i]!=valB_1[i] || valA_2[i]!=valB_2[i]){puts("NO");flag=0;break;}
if(flag)puts("YES");
}
int main(){
freopen("1676.in","r",stdin);
freopen("1676.out","w",stdout);
scanf("%d",&test);
while(test--)Solve();
return 0;
}