冰岛人(二叉树链式存储,从底部向上遍历)
题目详情 - L2-030 冰岛人 (25 分) (pintia.cn)题目详情 - L2-030 冰岛人 (25 分) (pintia.cn)题目详情 - L2-030 冰岛人 (25 分) (pintia.cn)
题目要求:
所谓“五代以内无公共祖先”是指两人的公共祖先(如果存在的话)必须比任何一方的曾祖父辈分高
测试点分析:
1、两人的公共祖先(如果存在的话)必须比任何一方的曾祖父辈分高(答案错误3、6 )比如2个人有相同的祖先,这个祖先是一个人的三代,另一个人的六代,那么他也算是二人的共同祖先。
2、判断时双方的祖先都超出了5代,那么就不需要判断(测试点6运行超时)
#include<bits/stdc++.h>
using namespace std;
struct node{
char sex;
string father;
};
map<string,node>people;
inline int judge(string a, string b)
{
int i = 1, j;
for(string A = a; !A.empty(); A = people[A].father,i ++ )
{
j = 1;
for(string B = b; !B.empty(); B = people[B].father, j ++ )
{
if(i >= 5 && j >= 5) return 1;//双方都超出5代之后,不需要继续寻找(测试点6 运行超时)
if(A == B && (i<5||j<5)) return 0; //五代内出现共同祖先,返回false(测试点3、6答案错误)
}
}
return 1;//没有公共祖先
}
int main(){
int n; cin>>n;
cin.sync_with_stdio(false);
string a, b, t;
for(int i = 0; i < n; i++)
{
cin >> a >> b;
if(b.back() == 'n') //+sson
people[a] = {'m',b.substr(0,b.size()-4)};
else if(b.back()=='r')//+sdottir
people[a] = {'f',b.substr(0,b.size()-7)};
else people[a].sex = b.back();
}
int m; cin >> m;
for(int i = 0; i < m; i++)
{
cin >> a >> t >> b >> t;
if(!people.count(a) || !people.count(b))
printf("NA\n");
// if(people.find(a) == people.end() || people.find(b) == people.end())
// printf("NA\n");
else if(people[a].sex == people[b].sex)
printf("Whatever\n");
else if(judge(a,b))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}