题目大意:找两结点的最近公共祖先结点。
思路:
1、将名字用数字来编号,并记录性别。
2、寻找并记录各个结点的父结点的编号。
3、判断两人是否可以交往。这里难点是如何寻找公共结点 。可以这样,a到根结点有一条路径,记录下a到路径中各个结点的距离。同样对b进行同样的操作,在b到根结点的过程中,若两条路径相交,则是公共祖先,若距离都大于等于4,则是五代以外,满足要求,可以交往。
注意,“五代以内无公共祖先”是指两人的公共祖先(如果存在的话)必须比任何一方的曾祖父辈分高。
辈分是这样排的:己身 父母亲 祖父母 曾祖父母 高祖父母
提交代码(参考别人):
#include<bits/stdc++.h>
using namespace std;
int n;
bool judge(vector<int>&F,int a,int b){
vector<int>cnt(n+2,0) , dis1(n+2,0) , dis2(n+2,0);
cnt[a]++;
cnt[b]++;
while(F[a]!=-1){
int t=F[a];
cnt[t]++;
dis1[t]=dis1[a]+1;
if(t==b){
return false; }
a=t;
}
while(F[b]!=-1){
int t=F[b];
cnt[t]++;
dis2[t]=dis2[b]+1;
if(cnt[t]>1){
if(dis2[t]>=4&&dis1[t]>=4) {
return true; }
else {
return false; }
}
b=t;
}
return true;
}
int main(){
string f1,f2;
scanf("%d",&n);
string s;
map<string,int>tmap;
vector< pair<string,string>