https://codeforces.com/contest/115/problem/A
题目大意:
给定n个节点,每个节点都有一个不同于自己的数值,表示自己的老板,-1表示自己就是老板。
现在玩游戏需要组队,一组队伍中,人数任意,但是任意两个都不能是直系的老板或者老老板。。。老老老板等形成上下级关系。
问我们可以组成队伍的最小数量是多少?
input
5
-1
1
2
1
-1
output
3
- 我其实一开始猜到了这题考的就是树的深度,但是由于根节点的复杂性,我依靠自己的力量还是没有想出合理的方案来
- 看了下别人写的,顿悟
- 为什么不再造一个更大的节点呢?作为全部已知根节点的总司令
- 这样我们从总司令开始往下爆搜,既不会改变根节点,也可以不改变深度直接一遍跑完
- 妙哉~
//我们要想没有上级和下属呆在一起,那我们可以直接把同级的人塞在一起就行了呀
//所以就可以直接转化成寻找树的最大深度
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=200200,M=2002;
LL n,a[N],maxn=0;
vector<LL> g[N];
void dfs(LL u,LL depth)
{
maxn=max(maxn,depth);
for(LL i=0;i<g[u].size();i++)
{
dfs(g[u][i],depth+1);
}
}
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
cin>>n;
for(LL i=1;i<=n;i++)
{
cin>>a[i];
//一个很巧妙的点就在于我们把0作为根节点,所以与那本意义上的根节点也就成了第一层子节点而已
//就无需在每个节点上都跑一遍(米奇妙妙屋)
if(a[i]==-1) g[0].push_back(i);
else g[a[i]].push_back(i);
}
dfs(0,0);//从0这个的节点开始跑,深度初始化为1
cout<<maxn<<endl;
}
return 0;
}
标签:LL,Codeforces,dfs,Only,maxn,深度,节点,老板
From: https://www.cnblogs.com/Vivian-0918/p/16756463.html