# NBUT 1218 You are my brother

• ### [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.
• 样例输入
• 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
• 提示
• 无
• 来源
• 辽宁省赛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+线段树来做，只是目前还没搞懂，等待更新……