分析
5种关系:
- X is a child of Y (fa[x]==y)
- X is the parent of Y (fa[y]==x)
- X is a sibling of Y (fa[x]==fa[y])
- X is a descendant of Y (fa[fa[..fa[x]]]=y)
- X is an ancestor of Y (fa[fa[..fa[y]]]=x)
只需要将父辈和孩子间的关系存储下来就可以了。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int n,m,fa[110];
vector<int> s[110]; //s[i]存储第i辈所有人的信息
map<string,int> mp;
int main()
{
for(int i=0;i<110;i++) fa[i]=i;
cin>>n>>m;
getchar();
string nl;
for(int i=1;i<=n;i++)
{
getline(cin,nl);
int co=0;
for(int j=0;j<nl.size();j++)
{
if(nl[j]==' ') co++;
}
if(!co) fa[i]=0; //该人为所有人的祖先
else{
int len=s[co/2].size();
fa[i]=s[co/2][len-1]; //该人的父辈为上一辈的最后一个人
}
s[co/2+1].push_back(i);
mp[nl.substr(co)]=i; //该人的序号为i
}
string q;
for(int i=1;i<=m;i++)
{
getline(cin,q);
stringstream ssin(q);
vector<string> temp;
while(ssin>>q) temp.push_back(q);
int a=mp[temp[0]],b=mp[temp[5]];
int f=0;
if(a==b){ //两个人都是自己,不能做判断,直接continue
puts("False");
continue;
}
if(temp[3]=="child"){
if(fa[a]==b) f=1;
}
if(temp[3]=="parent"){
if(fa[b]==a) f=1;
}
if(temp[3]=="descendant"){
while(a!=0){
if(a==b) f=1;
a=fa[a];
}
}
if(temp[3]=="ancestor"){
while(b!=0){
if(b==a) f=1;
b=fa[b];
}
}
if(temp[3]=="sibling"){
if(fa[a]==fa[b]) f=1;
}
if(f) puts("True");
else puts("False");
}
return 0;
}