zoukankan      html  css  js  c++  java
  • FZU 2057 家谱(DFS)

     Problem 2057 家谱

    Accept: 135    Submit: 364
    Time Limit: 1000 mSec    Memory Limit : 32768 KB

     Problem Description

    由于计划生育的实行,我们以及将来几代人都会是独生子女,即每对夫妇只会有一个孩子。那么给你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

    1
    9
    3 6 7
    5 8 9
    1 2 3
    2 4 5
    3
    8 2
    1 7
    3 9

     Sample Output

    0 MF
    1 MM
    Relative

     Source

    FOJ有奖月赛-2011年11月

    DFS加路径打印

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    const int MAXN=10000+5;//1父亲    2母亲
    struct node
    {
        int l,r;
    }a[MAXN];
    int str[MAXN],lenth;
    
    void print(int str[])
    {
        for(int i=0;i<lenth;i++)
        {
            if(str[i]==1) printf("F");
            if(str[i]==2) printf("M");
        }
    }
    
    bool DFS(int cur,int e,int cnt)
    {
        if(cur==e) {lenth=cnt;return true;}
        else if(a[cur].l==0 && a[cur].r==0) return false;
        else
        {
            str[cnt]=1;
            if(DFS(a[cur].l,e,cnt+1)) return true;
            str[cnt]=2;
            if(DFS(a[cur].r,e,cnt+1)) return true;
            return false;
        }
    }
    
    int main()
    {
        int kase,n,num,m,x,y,sx;
        bool flag;
        cin>>kase;
        while(kase--)
        {
            memset(a,0,sizeof(a));
            memset(str,0,sizeof(str));
            scanf("%d",&n);
            for(int i=1;i<=n/2;i++)
            {
                scanf("%d",&num);
                scanf("%d %d",&a[num].l,&a[num].r);
            }
            scanf("%d",&m);
            for(int i=1;i<=m;i++)
            {
                scanf("%d %d",&x,&y);
                if(DFS(y,x,0))
                {
                    printf("0 ");
                    print(str);
                }
                else if(DFS(x,y,0))
                {
                    printf("1 ");
                    print(str);
                }
                else
                    printf("Relative");
                printf("
    ");
                memset(str,0,sizeof(str));
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    cxgrid动态创建列
    cxgrid显示海量数据
    Delphi 两个应用程序(进程)之间的通信
    Delphi实现窗体内嵌其他应用程序窗体
    Change tab position of PageControl to bottom
    how can I make the login form transparent?
    UniDBGrid增加显示记录数的label及隐藏refresh按钮
    java工厂模式实例化class
    Java 语言细节
    applet示例 WelcomeApplet.java <Core Java>
  • 原文地址:https://www.cnblogs.com/clliff/p/4338075.html
Copyright © 2011-2022 走看看