本来要用并查集的,发现并查集只能解决‘-’还是非‘-’的问题。
干脆直接用dfs搜索一下(这个图非常小 26*26的图)。
如果from到to搜不通,就从to到from再搜一次。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
const int maxn=26;
vector<int> g[maxn];
int n,m,depth;
string s;
void print(int d,int flag){ //打印,flag表示是 0表示长辈,1表示孩子,d表示深度depth
if(d==1){
cout<<(flag==0?"parent":"child")<<endl;
}else if(d==2){
cout<<(flag==0?"grandparent":"grandchild")<<endl;
}else{
for(int i=0;i<d-2;i++){
cout<<"great-";
}
cout<<(flag==0?"grandparent":"grandchild")<<endl;
}
}
void dfs(int f,int t,int d){ //from to depth
if(f==t){
depth=d;
return ;
}
for(int i=0;i<g[f].size();i++){
dfs(g[f][i],t,d+1);
}
}
int main(){
while(cin>>n>>m){
for(int i=0;i<n;i++){
cin>>s;
if(s[1]!='-') g[s[0]-'A'].push_back(s[1]-'A');
if(s[2]!='-') g[s[0]-'A'].push_back(s[2]-'A');
}
for(int i=0;i<m;i++){
depth=-1;
cin>>s;
int f=s[0]-'A',t=s[1]-'A';
dfs(f,t,0);
if(depth==-1){ //如果第一种搜不通,就按第二种
dfs(t,f,0);
if(depth==-1){
cout<<"-"<<endl;
}else{
print(depth,0);
}
}else{
print(depth,1);
}
}
}
return 0;
} 


京公网安备 11010502036488号