CF115A题解
修改日志
- 2022.8.6 21:55 :去处了普通英文的 ,对算法进一步描述。
题意简化
给你一个森林(注意有可能有多个 为 。所以是森林,但下文会做处理),求森林里每棵树的最大深度的最大值
思路
不难想到用广搜。
因为可能会有多个没有直接总经理的节点(既没有上级),那为了方便广搜,我们可以建立一个虚拟 号节点,来充当 为 的节点的上级。
对于每个节点,设其深度为 ,遍历一遍他的儿子节点。因为这是一棵树,所以不用判断这个节点是否被访问过。对于每个儿子节点的深度,就是其父亲的深度 ,接着将得到的深度 对 取个 。
队列我习惯用 queue 容器维护。
代码(简单明了的广搜)
#include<bits/stdc++.h>
using namespace std;
int n,dep[2010],ans=-1,f[2010],nxt[2010],to[2010],num;
struct e{
int u,d;
};
queue<e>q;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int p;
cin>>p;
p=max(0,p);
to[++num]=i;
nxt[num]=f[p];
f[p]=num;
}
q.push({0,0});
while(!q.empty()){
int v=q.front().u,dep=q.front().d;
ans=max(ans,dep);
q.pop();
for(int i=f[v];i;i=nxt[i]){
q.push({to[i],dep+1});
}
}
cout<<ans;
return 0;
}

浙公网安备 33010602011771号