时间:1s 空间:128M
题目描述:
给你一棵以1为根的树,求树的深度
输入格式:
第一行输入一个整数n,表示树的总点数
第二行输入n−1个数,第i个数表示i+1的父节点标号
输出格式:
输出一个整数表示树的深度(根节点的深度为1)
样例输入:
4
1 2 3
样例输出:
4
约定:
1<=n<=100000
提示:
此题是XJOI 3325 树的深度 的数据加强板。深度优先搜索请点击以下链接(不能满分,仅供参考):
https://blog.csdn.net/zj_mrz/article/details/81149168
深搜能过吗?很悬。但别忘了还有广搜!同时,储存建议用vector,空间炸了的话就不是开玩笑了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std ;
int l = 1 , r = 1 , dl [ 100001 ] , n ;
vector<int> T [ 100001 ];
int bh [ 100001 ] ;
int main ( )
{
scanf ( "%d" , & n ) ;
int k ;
memset ( dl , 0 , sizeof(dl) ) ;
memset ( bh , 0 , sizeof(bh) ) ;
for ( int i = 2 ; i <= n ; i ++ )
{
scanf ( "%d" , & k ) ;
T [ k ] . push_back ( i ) ;
}
dl [ 1 ] = 1 ;
bh [ 1 ] = 1 ;
while ( l <= r )
{
for ( int i = 0 ; i < T [ dl[l] ] . size ( ) ; i ++ )
{
r ++ ;
dl [ r ] = T [ dl[l] ] [ i ] ;
bh [ r ] = bh [ l ] + 1 ;
}
l ++ ;
}
int ans = 0 ;
for (int i = 1 ; i <= n+1 ; i ++ ) if ( bh [ i ] > ans ) ans = bh [ i ] ;
printf ( "%d\n" , ans ) ;
return 0 ;
}
相关链接:
XJOI 题解小全:
https://blog.csdn.net/zj_mrz/article/details/80949787
XJOI 3325 树的深度 题解:
https://blog.csdn.net/zj_mrz/article/details/81149168