CF115A题解

修改日志

  • 2022.8.6 21:55 :去处了普通英文的 LaTeX\LaTeX,对算法进一步描述。

题意简化

给你一个森林(注意有可能有多个 pip_i1-1。所以是森林,但下文会做处理),求森林里每棵树的最大深度的最大值

思路

不难想到用广搜。

因为可能会有多个没有直接总经理的节点(既没有上级),那为了方便广搜,我们可以建立一个虚拟 00 号节点,来充当 pip_i1-1 的节点的上级。

对于每个节点,设其深度为 depdep,遍历一遍他的儿子节点。因为这是一棵树,所以不用判断这个节点是否被访问过。对于每个儿子节点的深度,就是其父亲的深度 dep+1dep+1,接着将得到的深度 dep2dep_2ansans 取个 max\max

队列我习惯用 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;
}
posted @ 2022-08-05 11:55  fengxiaoyi  阅读(14)  评论(0)    收藏  举报  来源