NBUT 1218 You are my brother

来源:互联网 发布:湖南省软件协会 编辑:程序博客网 时间:2024/05/20 19:47
  • [1218] You are my brother

  • 时间限制: 1000 ms 内存限制: 131072 K
  • 问题描述
  • Little A gets to know a new friend, Little B, recently. One day, they realize that they are family 500 years ago. Now, Little A wants to know whether Little B is his elder, younger or brother.
  • 输入
  • There are multiple test cases.
    For each test case, the first line has a single integer, n (n<=1000). The next n lines have two integers a and b (1<=a,b<=2000) each, indicating b is the father of a. One person has exactly one father, of course. Little A is numbered 1 and Little B is numbered 2.
    Proceed to the end of file.
  • 输出
  • For each test case, if Little B is Little A’s younger, print “You are my younger”. Otherwise, if Little B is Little A’s elder, print “You are my elder”. Otherwise, print “You are my brother”. The output for each test case occupied exactly one line.
  • 样例输入
  • 51 32 43 54 65 661 32 43 54 65 76 7
  • 样例输出
  • You are my elderYou are my brother
  • 提示
  • 来源
  • 辽宁省赛2010

    题目意思很简单,输入N对数a,b,表示b是a的父亲,最后求的是1和2的关系,也就是树的深度。(注意,若a和b不在同一棵树上,则他们的关系为brother)

    代码一:
    #include <cstring>#include <cstdio>int main() {    int n,x,y;    int ans[2005];    while(~scanf("%d",&n)) {        memset(ans,0,sizeof(ans));        for(int i=0; i<n; i++) {            scanf("%d%d",&x,&y);            ans[x]=y;        }        int temp=1,a=0,b=0;        while(ans[temp]){            a++;            temp=ans[temp];        }        temp=2;        while(ans[temp]!=0) {            b++;            temp=ans[temp];        }        if(a>b)            printf("You are my elder\n");        else if(a<b)            printf("You are my younger\n");        else            printf("You are my brother\n");    }    return 0;}

    代码二:
    #include <cstdio>using namespace std;int main() {    int n,x,y;    int la,lb,a,b;    while(~scanf("%d",&n)) {        la=1;   lb=2;    a=0;    b=0;        while(n--){            scanf("%d%d",&x,&y);            if(la!=lb) {                if(x==la) {                    la=y;   a++;                }                if(x==lb) {                    lb=y;   b++;                }            }        }        if(a>b)            printf("You are my elder\n");        else if(a<b)            printf("You are my younger\n");        else            printf("You are my brother\n");    }    return 0;}

    代码三:

    #include <cstdio>int fa[2010];int n,x,y;int Find(int x,int &H) {    while(x != fa[x]) {        x = fa[x];        H++;    }    return x;}int main() {    while(~scanf("%d",&n)) {        for(int i = 1; i <= 2000; i++)      //用并查集时,初始化要注意上限,如果用n会TLE            fa[i] = i;        while(n--) {            scanf("%d %d",&x,&y);            fa[x] = y;        }        int a = 0 , b = 0 ;        int f1 = Find( 1 , a );        int f2 = Find( 2 , b );        if(f1 != f2)                  //此时 1 和 2 并不在同一棵树上            printf("You are my brother\n");        else {            if(a > b)                printf("You are my elder\n");            else if(a < b)                printf("You are my younger\n");            else                printf("You are my brother\n");        }    }    return 0;}


    以上代码 有一部分是根据网上题解思路所写的,据说这题还可以用 DFS+线段树来做,只是目前还没搞懂,等待更新……
0 0