冰岛人(二叉树链式存储,从底部向上遍历)

题目详情 - 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;
}

posted @ 2022-05-05 08:41  光風霽月  阅读(30)  评论(0编辑  收藏  举报