题目链接
题目分析:
注意:
1:不是二叉树
2:结点的移动指 移动到父节点
不能模拟结点移动(超时);需要结合树的特性,结点向上移动的过程中,总会相遇,所以计算距根节点的距离即可!小者胜出。
解题过程:
这道题做得真是一波三折啊!
一开始的思路是模拟结点的移动,每移动一步检查一下:
建树结构体,用map<key, tree>
,超时;
后发现只用记录父节点序号即可,用map<key, int>
,继续超时;
突然意识到直接用int[]
不就行了,还是超时;(好蠢!)
看来思路有问题,看了一眼海岛blog的思路,恍然大悟!
程序说明:
数组在10^6
级别左右需要开在main()
外面
AC程序:
/**************************
*@Author: 3stone
*@ACM: HDU-2545
*@Time: 18/6/11
*@IDE: VS Code
***************************/
#include<cstdio>
#include<algorithm>
#define maxn 100005
using namespace std;
int tree[maxn]; //保存父节点
//计算到根节点的距离
int get_dis(int key) {
int num = 0;
while(tree[key] != -1){
num++;
key = tree[key];
}
return num;
}
int main() {
int M, N;
int a, b, x, y;
while(scanf("%d%d", &N, &M) != EOF) {
if(N == 0 && M == 0)
break;
//清空树
memset(tree, -1, sizeof(tree));
//读入父子结点关系
for (int i = 0; i < N - 1; i++) {
scanf("%d%d", &a, &b);
tree[b] = a;
}
//读入查询
for (int i = 0; i < M; i++) {
scanf("%d%d", &x, &y);
int dis_x = get_dis(x);
int dis_y = get_dis(y);
if(dis_x <= dis_y)
printf("lxh\n");
else
printf("pfz\n");
}
}
return 0;
}