You are my brother(树状)

题目描述

 

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.

样例输入

5
1 3
2 4
3 5
4 6
5 6
6
1 3
2 4
3 5
4 6
5 7
6 7

样例输出

You are my elder
You are my brother

题意:1 和 2 有共同的祖先,寻找A 与 B 的关系 。输入N对数,B 是 A 的父亲。A 与 B 有三种关系 。 elder , younger , brother。

可以把这道题看成一颗树 , 共同祖先是根节点。比较 A 与 B 的树深度 。

代码一:
#include <bits/stdc++.h>
using namespace std;
int vis[3000];


int main()
{
    int n ;
    while(cin >> n)
    {
        memset(vis , 0 , sizeof(vis));
        for(int i = 0 ; i < n ; i++)
        {
            int u ,v ;
            cin >> u >> v ;
            vis[u] = v ; // 输入形成树状。
        }
        int temp = 1 , a = 0;
        while(vis[temp] != 0)
        {
            temp = vis[temp] ; // 通过树末往上延申
            a++ ;//记录树节点数
        }
        int tem = 2 , b = 0;
        while(vis[tem] != 0)
        {
            tem = vis[tem] ;
            b++;
        }
    //通过比较树的节点深度来判断A 与 B 的关系。
if(a > b) { cout << "You are my elder" << endl ; } else if(a < b) cout << "You are my younger" << endl ; else cout << "You are my brother" << endl ; } return 0; }

代码二(并查)但我觉的没怎么体现并查

#include <bits/stdc++.h>
using namespace std;
int vis[3000];

void Find(int x , int &a)
{
    while(x != vis[x])
    {
        x = vis[x] ;
        a++;
    }

}


int main()
{
    int n ;
    while(cin >> n)
    {
        memset(vis , 0 , sizeof(vis));
        for(int i = 1 ; i <= 2000 ; i++)
            vis[i] = i ;
        for(int i = 0 ; i < n ; i++)
        {
            int u , v ;
            cin >> u >> v ;
            vis[u] = v ;
        }
        int a = 0 , b = 0 ;
        Find(1 , a);
        Find(2 , 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;
}
 

猜你喜欢

转载自www.cnblogs.com/nonames/p/11056032.html
my
You