Codeforces Beta Round #87 (Div. 1 Only) A. Party(树的深度+dfs)

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;
}
posted @ 2022-10-05 21:29  高尔赛凡尔娟  阅读(29)  评论(0编辑  收藏  举报