2018_2_13_Family Tree_树_层次结构

10 篇文章 0 订阅
Family Tree

Time Limit: 2 Seconds      Memory Limit: 65536 KB

A professor of anthropology was interested in people living in isolated islands and their history. He collected their family trees to conduct some anthropological experiment. For the experiment, he needed to process the family trees with a computer. For that purpose he translated them into text files. The following is an example of a text file representing a family tree.

John
 Robert
  Frank
  Andrew
 Nancy
  David

Each line contains the given name of a person. The name in the first line is the oldest ancestor in this family tree. The family tree contains only the descendants of the oldest ancestor. Their husbands and wives are not shown in the family tree. The children of a person are indented with one more space than the parent. For example, Robert and Nancy are the children of John, and Frank and Andrew are the children of Robert. David is indented with one more space than Robert, but he is not a child of Robert, but of Nancy. To represent a family tree in this way, the professor excluded some people from the family trees so that no one had both parents in a family tree.

For the experiment, the professor also collected documents of the families and extracted the set of statements about relations of two persons in each family tree. The following are some examples of statements about the family above.

John is the parent of Robert.
Robert is a sibling of Nancy.
David is a descendant of Robert.

For the experiment, he needs to check whether each statement is true or not. For example, the first two statements above are true and the last statement is false. Since this task is tedious, he would like to check it by a computer program.


Input

The input contains several data sets. Each data set consists of a family tree and a set of statements. The first line of each data set contains two integers n (0 < n < 1000) and m (0 < m < 1000) which represent the number of names in the family tree and the number of statements, respectively. Each line of the input has less than 70 characters.

As a name, we consider any character string consisting of only alphabetic characters. The names in a family tree have less than 20 characters. The name in the first line of the family tree has no leading spaces. The other names in the family tree are indented with at least one space, i.e., they are descendants of the person in the first line. You can assume that if a name in the family tree is indented with k spaces, the name in the next line is indented with at most k + 1 spaces.

This guarantees that each person except the oldest ancestor has his or her parent in the family tree. No name appears twice in the same family tree. Each line of the family tree contains no redundant spaces at the end.

Each statement occupies one line and is written in one of the following formats, where X and Y are different names in the family tree.

X is a child of Y.
X is the parent of Y.
X is a sibling of Y.
X is a descendant of Y.
X is an ancestor of Y.

Names not appearing in the family tree are never used in the statements. Consecutive words in a statement are separated by a single space. Each statement contains no redundant spaces at the beginning and at the end of the line.

The end of the input is indicated by two zeros.


Output

For each statement in a data set, your program should output one line containing True or False.

The first letter of True or False in the output must be a capital. The output for each data set should be followed by an empty line.


Sample Input

6 5
John
 Robert
  Frank
  Andrew
 Nancy
  David
Robert is a child of John.
Robert is an ancestor of Andrew.
Robert is a sibling of Nancy.
Nancy is the parent of Frank.
John is a descendant of Andrew.
2 1
abc
 xyz
xyz is a child of abc.
0 0


Sample Output

True
True
True
False
False

True


Source: Asia 2000, Tsukuba (Japan)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<fstream> 
#include<map>
using namespace std;

typedef map<string,string> mss;

char buf[75];
const int N=1000+10;
int g[N];
string h[N];
char tt1[6];
char tt2[6];
char ss1[25];
char ss2[25];
char re[25];
mss parent;

bool solve(string &a,string &b,string &ans){
	if(ans=="child")return parent[a]==b;
	if(ans=="parent")return parent[b]==a;
	if(ans=="sibling")
	return parent[a]!=""&&parent[b]!=""&&parent[a]==parent[b]; 
	if(ans=="ancestor"){
		string nu="";
		while(b!=nu){
			b=parent[b];
			if(b==a)return true;
		}
		return false;
	}else{
		string nu="";
		while(a!=nu){
			a=parent[a];
			if(b==a)return true;
		}
		return false;
	}
}

int main(){
	int n,m;
	while(scanf("%d%d",&n,&m),n||m){
		getchar();
		int l=0;		
		parent.clear();
		for(int i=0;i<n;i++){
			gets(buf);
			int pos=0;
			int len=strlen(buf);
			int j;
			for(j=0;j<len;j++)
			if(buf[j]==' ')pos++;
			else break;
			string name;
			for(;j<len;j++)
			name+=buf[j];
			while(pos<=g[l]&&l>0)l--;
			if(l>0)	parent[name]=h[l];
			else parent[name]="";
			h[++l]=name;
			g[l]=pos;
		}
		for(int i=0;i<m;i++){
			gets(buf);
			sscanf(buf,"%s%s%s%s%s%s",ss1,tt1,tt2,re,tt1,ss2);
			string s1=ss1;
			string s2;
			for(int j=0;j<strlen(ss2)-1;j++)
			s2+=ss2[j];
			string relation=re;
			if(solve(s1,s2,relation))puts("True");
			else puts("False");
		}
		puts("");
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值