#include
#include
#include
#include
#include
#include
using namespace std;
#define NEXT_MAX 1550
struct node{
int next_num = 0;
int next[NEXT_MAX] = {0};
int height[2] = {0};//最长的两个深度
};
int n=0,m=0;//n为交换机数,m为主机数
int d=0,ans=0;
node Node[20002];
void dfs(int v)
{
if(v==0) return;
for(int i = 1;i<=Node[v].next_num;i++)
{
dfs(Node[v].next[i]); //深度便利
}
int MAX = 0;
for(int i = 1;i <= Node[v].next_num;i++)
{
if(Node[Node[v].next[i]].height[0]+1 >= Node[Node[v].next[i]].height[1]+1)
MAX=Node[Node[v].next[i]].height[0]+1;
else
MAX=Node[Node[v].next[i]].height[1]+1;
int temp;
if(Node[v].height[0] >= Node[v].height[1])
temp = Node[v].height[0];
else
temp = Node[v].height[1];
if(MAX >= temp)
{
Node[v].height[0] = MAX;
Node[v].height[1] = temp;
}
}
d = Node[v].height[0]+Node[v].height[1];
if(d > ans)
ans = d;
}
int main(int argc,char** argv)
{
scanf("%d%d",&n,&m);
for(int i = 2 ; i <= n ; i ++)
{
int temp;
scanf("%d",&temp);
Node[temp].next_num ++;
Node[temp].next[Node[temp].next_num] = i ;
}
for(int i = n + 1; i<=m+n;i++)
{
int temp;
scanf("%d",&temp);
Node[temp].next_num ++;
Node[temp].next[Node[temp].next_num] = i ;
}
dfs(1);
printf("%d",ans);
return 0;
}
代码不长,思路是把深度便利,每一个结点的height数组有两个,一直更新得到最深的两棵树的深度,这样可以求出树的直径,从而解出最远路径,为什么代码错误运行1.032s 不太理解跟满分答案也没太多区别,为什么这份代码耗时很多,哪里耗费了主要的时间呢?求人解答