P3325 树的深度 题解

题目描述:

给你一棵以 1 为根的树,求树的深度,如下的树深为 5。


输入格式:

第一行输入一个整数 n,表示树的总点数。(1≤n≤1000)

第二行输入 n−1 个数,第 i 个数表示 i+1 的父节点标号

输出格式:

输出一个整数表示树的深度(根节点的深度为1)

Input

10
8 4 8 10 1 1 1 3 8

Output

5

观前提示
看了下其他大佬的题解,自认为是最好理解的一种
制作不易,喜欢请点个赞吧(蒟蒻的第一篇题解
——————————————————————————————
题目分析:
求树的深度,没什么好说的,但是这个输入格外扎眼

第 i 个数表示 i+1 的父节点标号

这是啥?直接输入每个节点的父节点不就好了搞这么麻烦(实际就是这个蒟蒻讨厌复杂的题目
不过仔细看看也就还好。

(1≤n≤1000) 太好了数据范围这么小,邻接矩阵我来了

mp[i+1][k]=1;

诶等等,邻接矩阵啊?哦哦,那应该这样:

mp[i+1][k]=1;
mp[k][i+1]=1;

那该怎么写深搜呢……有了!

void dfs(int sx,int step){//sx存储当前子节点,step代表深度
    maxx=max(maxx,step);//只要深度变大就更新
    if(vis[sx]==1) return ;//标记过就退出
    vis[sx]=1;//标记
    for(int i=1;i<=n;i++){
        dfs(i,step+1);//遍历
    }
}

乍一看没啥问题,然后就……

最新提交:

Wrong Answer

0 分

好嘛,还得在函数里找问题。
最后在经过本蒟蒻九九七十二次的修改,奉上AC代码 的模板(被打

void dfs(int sx,int step){
    //更新
    if(vis[sx]==0) vis[sx]=1;
    else return ;
    for(int i=1;i<=n;i++){
        if(此节点存在){
            //删除此节点的另一个端点
            dfs(i,step+1);
        }
    }
}
int main(){
    cin>>n;
    for(i~n-1){
         //前面教你们的输入
    }
    dfs(1,1);
    cout<<maxx;
    return 0;
}

好了,本次题解就到这里,谢谢观看
1F60A

还有问题私我ovo

此话题已在最后回复的 15 天后被自动关闭。不再允许新回复。