家族树(dfs)

##牛客网假日赛:家族树

题目描述

Farmer John拥有一个传承数代的家族经营的农场,其中的奶牛的根源同样也可以在这个农场中追溯数代。通过检索古老的记录,Farmer John好奇于现在的这群奶牛互相之间是什么关系。请帮帮他!

输入描述:

输入的第一行包含N(1≤N≤100),之后是两头奶牛的名字。每头奶牛的名字都是由至多10个大写字母(A…Z)组成的字符串。Farmer John好奇于这行输入中这两头奶牛之间的关系。

接下来的N行,每行包含两头奶牛的名字X和Y,表示X是Y的母亲。

输出描述:

输出包含一行,表示输入第一行指定的两头奶牛之间的关系(简单起见,在下面的例子中,将这两头奶牛称为BESSIE和ELSIE)。下面是可能出现的不同种类的关系:如果BESSIE和ELSIE的母亲是同一头奶牛,输出“SIBLINGS”。BESSIE可能是ELSIE的直系后代,也就是说ELSIE是BESSIE的母亲(mother),外祖母(grand-mother),外曾外祖母(great-grand-mother),外曾外曾外祖母(great-great-grand-mother),等等。如果是这种情况,输出“ELSIE is the (relation) of BESSIE",其中(relation)是适当的关系,比如“great-great-grand-mother”。如果ELSIE不是BESSIE的某个祖先或姐妹,但是是BESSIE的某个祖先的孩子,那么ELSIE就是BESSIE的姨母(aunt)。(译者注:英语原题在这里表述有误,供题人已作出声明。)如果ELSIE是BESSIE的外祖母的孩子,输出“ELSIE is the aunt of BESSIE”;如果ELSIE是BESSIE的外曾外祖母的孩子,输出“ELSIE is the great-aunt of BESSIE”;如果ELSIE是BESSIE的外曾外曾外祖母的孩子,输出“ELSIE is the great-great-aunt of BESSIE”;以此类推。如果BESSIE和ELSIE有任何其他的亲戚关系(也就是说,她们有共同的祖先),她们就是表姐妹,输出“COUSINS”。如果BESSIE和ELSIE既没有共同的祖先,其中任何一头也不是另一头的直系后代,输出“NOT RELATED”。

下图描述了上述关系,你只需考虑这些关系。观察到有一些像是“甥女(niece)”(姊妹的女儿)的关系是不必要的,这是由于如果BESSIE是ELSIE的甥女,那么ELSIE就是BESSIE的姨母。

输入

7 AA BB
MOTHER AA
GGMOTHER BB
MOTHER SISTER
GMOTHER MOTHER
GMOTHER AUNT
AUNT COUSIN
GGMOTHER GMOTHER

输出

BB is the great-aunt of AA

链接:https://ac.nowcoder.com/acm/contest/997/D

题意:题信息量有些大,但是读个两三遍就懂了,就是求两个人是什么关系,一定要注意grand和great两个单词不同。

题解:建树,dfs跑树,标记升几次、降几次找到该人。

#include <iostream>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
vector<int>up[205];
vector<int>down[205];
map<string,int>maps;
int book[205];
int topx,topy;//升,降
bool dfs(int x,int endx,int numx,int numy)
{
	if(book[x]==0)
	book[x]=1;
	else
	return false;
	if(x==endx)
	{
		topx=numx;
		topy=numy;
		return true;
	}
	for(int i=0;i<up[x].size();i++)
	if(dfs(up[x][i],endx,numx+1,numy))
		return true;
	for(int i=0;i<down[x].size();i++)
	if(dfs(down[x][i],endx,numx,numy+1))
		return true;
	return false;
}
void solve(string aa,string bb,int x,int y)
{
	if(dfs(x,y,0,0))
	{
		if(topx<topy)
		{
			swap(topx,topy);
			swap(aa,bb);
		}
		//	cout<<topx<<" "<<topy<<endl;
		if(topx==1&&topy==1)
		{
			cout<<"SIBLINGS";
		}
		else if(topy==0)//mother
		{
			//BB  AA
			cout<<bb<<" is the ";
			for(int i=0;i<topx-topy-2;i++)
			cout<<"great-";
			if(topx-topy>=2)
			cout<<"grand-";
			cout<<"mother of "<<aa;
		}
		else if(topy==1)//aunt
		{
			cout<<bb<<" is the ";
			for(int i=0;i<topx-topy-1;i++)
			cout<<"great-";
			cout<<"aunt of "<<aa;
		}
		else
		{
			cout<<"COUSINS";
		}
	}
	else
	cout<<"NOT RELATED";
}
int main()
{
	int n,len=0;
	string x,y,z,w;
	cin>>n>>x>>y;
	maps[x]=++len;
	maps[y]=++len;
	for(int i=0;i<n;i++)
	{
		cin>>z>>w;
		if(maps[z]==0)
		maps[z]=++len;
		if(maps[w]==0)
		maps[w]=++len;
		down[maps[z]].push_back(maps[w]);
		up[maps[w]].push_back(maps[z]);
	}
	solve(x,y,maps[x],maps[y]);
	return 0;
}
发布了39 篇原创文章 · 获赞 27 · 访问量 4136

猜你喜欢

转载自blog.csdn.net/qq_43381887/article/details/99419547