SDKD 14级组队练习赛(一) D 数组存储二叉树并递归遍历

由于计划生育的实行,我们以及将来几代人都会是独生子女,即每对夫妇只会有一个孩子。那么给你XXXX年某人的一张树形族谱,你能指出其中任意两人的关系吗?


Input

输入数据第一行一个整数T表示有T组数据。每组数据第一行一个正整数N (2 < N < 10000 ,且N为奇数),表示族谱中有N个家族成员。接下来N/2行,每行三个整数a b c,表示a的父亲是b,a的母亲是c。数据保证所给的是一棵树,家族成员的编号为1到N。接下来一行一个正整数M (0 < M < 100),表示有M询问。接下来M行,每行两个整数x y (x!=y),表示询问x y的关系。

Output

对于每一个询问,输出一行。若x是y的祖辈,则输出:0 S。若y是x的祖辈,则输出:1 S。若都不是以上两种情况,则输出:Relative。前两种情况中的S表示一个由大写字母F和M组成的字符串,F表示父亲,M表示母亲,表示前者是后者的XXX。例如:0 FMM 表示x是y的父亲的母亲的母亲。1 MFMF 表示y是x的母亲的父亲的母亲的父亲。以此类推。

Sample Input

193 6 75 8 91 2 32 4 538 21 73 9

Sample Output

0 MF
1 MM
Relative

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10005;
int n,m,qa,qb;
int fa[maxn],ma[maxn];
bool find_dfs(int pos,char *s,int l,int aim){
       if(pos == 0)
            return false;
        if(pos == aim){
            s[l] = '\0';
            return true;
        }
        s[l] = 'F';
        if(find_dfs(fa[pos],s,l + 1,aim))
            return true;
        s[l] = 'M';
        if(find_dfs(ma[pos],s,l + 1,aim))
            return true;
        return false;
}
int main(){
    int T;
    char s[maxn];
    //freopen("in.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
         scanf("%d",&n);
         memset(fa,0,sizeof(fa));
         memset(ma,0,sizeof(ma));
         for(int i = 0; i < n / 2; i++){
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                fa[a] = b;
                ma[a] = c;
         }
         scanf("%d",&m);
         for(int i = 0; i < m; i++){
                scanf("%d%d",&qa,&qb);
                if(find_dfs(qa,s,0,qb)){
                        printf("1 %s\n",s);
                }
                else if(find_dfs(qb,s,0,qa)){
                         printf("0 %s\n",s);
                }
                else
                    printf("Relative\n");
         }
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值