思路:
首先我们了解到它是如何是同构的?就是左右孩子可以互换,要不不换,那么唯一不变的是他们都是父亲节点的孩子,那么我们直接标记两个孩子,记录这两个孩子的父亲即可。
这样我们用pair存放两个孩子,就是不管他左还有右。只记录他的父亲节点,然后用第二棵树去验证。
这里需要特判只有一个节点时。直接判断这个节点是同一个吗就行。
#include <bits/stdc++.h>
using namespace std;
#define pii pair<char,char>
map<pii,char> mp;
int main(){
int n,m;
cin>>n;
char x[12],s[12];
int y[12],z[12];
x[n]='-';
for(int i=0;i<n;i++){
char a,b;
cin>>x[i]>>a>>b;
if(a=='-') y[i]=n;
else y[i]=a-'0';
if(b=='-') z[i]=n;
else z[i]=b-'0';
}
for(int i=0;i<n;i++){
mp[{x[y[i]],x[z[i]]}]=x[i];
mp[{x[z[i]],x[y[i]]}]=x[i];
}
cin>>m;
s[m]='-';
for(int i=0;i<m;i++){
char a,b;
cin>>s[i]>>a>>b;
if(a=='-') y[i]=n;
else y[i]=a-'0';
if(b=='-') z[i]=n;
else z[i]=b-'0';
}
if(n==m&&n==1){
if(s[0]==x[0]) {
cout<<"Yes";
}
else cout<<"No";
return 0;
}
if(n==m){
//puts("********");
for(int i=0;i<m;i++){
if(s[y[i]]=='-'&&s[z[i]]=='-') continue;
if(mp[{s[y[i]],s[z[i]]}]==s[i]) continue;
else {
//cout<<y[i]<<" "<<s[y[i]]<<z[i]<<" "<<s[z[i]]<<" "<<mp[{s[y[i]],s[z[i]]}];
//cout<<" "<<" "<<i<<"*" <<s[i]<<endl;
cout<<"No";
return 0;
}
}
cout<<"Yes";
}
else cout<<"No";
return 0;
}