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

来源:互联网 发布:linux cp命令 时间 编辑:程序博客网 时间:2024/05/17 03:06
由于计划生育的实行,我们以及将来几代人都会是独生子女,即每对夫妇只会有一个孩子。那么给你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
</pre><pre id="wmd-input" class="form-control font-rich has-selection" style="width:667px; height:463px; display:block"><span class="wmd-input-section" id="wmd-input-section-2"><span class="token p">这道题一开始用三个数组保存整个二叉树,后来发现用两个数组存下父母节点,然后反过来递归遍历就可。</span></span><pre class="sh-cpp sh-sourceCode" style="font-family:Courier New,Courier,monospace"><span class="sh-cbracket"></span><pre name="code" class="cpp">#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;}



0 0
原创粉丝点击