码迷,mamicode.com
首页 > 其他好文 > 详细

FZU 2057 家谱(dfs)

时间:2014-10-24 12:55:42      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   os   ar   for   

Problem 2057 家谱

Accept: 129    Submit: 356
Time Limit: 1000 mSec    Memory Limit : 32768 KB

bubuko.com,布布扣 Problem Description

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

bubuko.com,布布扣 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的关系。

bubuko.com,布布扣 Output

对于每一个询问,输出一行。

若x是y的祖辈,则输出:

0 S

若y是x的祖辈,则输出:

1 S

若都不是以上两种情况,则输出:

Relative

前两种情况中的S表示一个由大写字母F和M组成的字符串,F表示父亲,M表示母亲,表示前者是后者的XXX。例如:

0 FMM 表示x是y的父亲的母亲的母亲。

1 MFMF 表示y是x的母亲的父亲的母亲的父亲。

以此类推。

bubuko.com,布布扣 Sample Input

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

bubuko.com,布布扣 Sample Output

0 MF 1 MM Relative
 
 
搜索一下就ok了
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,n) for(i=1;i<=(n);++i)
using namespace std;
const int N = 100005;
typedef pair<int,int> pii;

struct _node{
    int fa,lc,rc;
    char val;
};

_node mes[N];
int n,sz;
char ans[N];

void add(int f,int l,int r)
{
    mes[f].lc = l;
    mes[f].rc = r;
    mes[l].fa = mes[r].fa = f;
    mes[l].val = F;
    mes[r].val = M;
}

int dfs(int s,int t,int cur)
{
    if(s==t)
    {
        ans[cur]=\0;
        return cur;
    }
    int lc=mes[s].lc,rc=mes[s].rc,k;
    if(lc)
    {
        ans[cur]=F;
        if(k=dfs(lc,t,cur+1))   return k;
    }
    if(rc)
    {
        ans[cur]=M;
        if(k=dfs(rc,t,cur+1))    return k;
    }
    return 0;
}

void run()
{
    int a,b,c,m,k;
    scanf("%d",&n);
    memset(mes,0,sizeof(mes));
    for(int i=1;i<=n/2;++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d%d",&a,&b);
        if(k=dfs(a,b,0))
        {
            printf("1 %s\n",ans);
//            print();
        }
        else if(k=dfs(b,a,0))
        {
            printf("0 %s\n",ans);
        }
        else    puts("Relative");
    }
}

int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
        run();
    return 0;
}

 

FZU 2057 家谱(dfs)

标签:des   style   blog   http   color   io   os   ar   for   

原文地址:http://www.cnblogs.com/someblue/p/4047799.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!