XJOI 3326 树的深度again 题解

时间: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

猜你喜欢

转载自blog.csdn.net/zj_mrz/article/details/81163752