您的位置:首页 > 其它

HDU 2545 树上战争(求树的高度)

2017-03-16 19:53 330 查看

树上战争

Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1051 Accepted Submission(s): 594

Problem Description

给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜

Input

输入包含多组数据

每组第一行包含两个数N,M(N,M<=100000),N表示树的节点数,M表示询问数,N=M=0表示输入结束。节点的编号为1到N。

接下来N-1行,每行2个整数A,B(1<=A,B<=N),表示编号为A的节点是编号为B的节点的父亲

接下来M行,每行有2个数,表示lxh和pfz的初始位置的编号X,Y(1<=X,Y<=N,X!=Y),lxh总是先移动

Output

对于每次询问,输出一行,输出获胜者的名字

Sample Input

2 1

1 2

1 2

5 2

1 2

1 3

3 4

3 5

4 2

4 5

0 0

Sample Output

lxh

pfz

lxh

提示:

本题输入、输出都很多,请使用scanf和printf代替cin、cout。

Source

UESTC 6th Programming Contest Online

分析

  该题目的题意跟清楚,看谁先占领对方的点。双方肯定都是向树根方向走的,只有那样才能占据更多的点。所以谁离树根最近,则谁就能赢。所以该题目是一个求树高的问题。

  用一个数组存储树,数组比链表好在可以快速找到该点的位置。用一个index数组记录该点在数组中的位置,就可以快速查找到。

  定义一个树节点的结构体,其中包括该点名称,父节点位置。

代码如下

#include <stdio.h>
#include <string.h>

typedef struct{
int a;
int pre;
}node;
int index[100005];
node ans[100005];
int main()
{
int n,m;
int i,j;
int a,b;
while(scanf("%d %d",&n,&m),n||m)
{
memset(index,0,sizeof(index));
int count=1;
node temp;
for(i=0;i<n-1;i++)
{
scanf("%d %d",&a,&b);
if(index[a]==0)
{
temp.a = a;
temp.pre=-1;
index[a] = count;
ans[count++] = temp;
}
if(index==0)
{
temp.a=b;
temp.pre = index[a];
index[b] = count;
ans[count++] = temp;
}
}

for(i=0;i<m;i++)
{
scanf("%d %d",&a,&b);
int height1=0;
int height2=0;
while(ans[index[a]].pre!=-1)
{
a = ans[ans[index[a]].pre].a;
height1++;
}

while(ans[index[b]].pre!=-1)
{
b = ans[ans[index[b]].pre].a;
height2++;
}
if(height1<=height2)
printf("lxh\n");
else
printf("pfz\n");
}
}

return 0;
}


[b]优化后代码

#include <stdio.h>
#include <string.h>
int fetch[100005];
int main()
{
int n,m;
int i,j;
int a,b;
while(scanf("%d %d",&n,&m),n||m)
{
memset(fetch,0,sizeof(fetch));
for(i=0;i<n-1;i++)
{
scanf("%d %d",&a,&b);
fetch[b]=a;
}
for(i=0;i<m;i++)
{
scanf("%d %d",&a,&b);
int height1=0;
int height2=0;
while(fetch[a]!=0)
{
a=fetch[a];
height1++;
}

while(fetch[b]!=0)
{
b=fetch[b];
height2++;
}
if(height1<=height2)
printf("lxh\n");
else
printf("pfz\n");
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树的高度