求树的高度和深度

就,真的,顺序很重要,不只是dfs,还有dp,还有很多东西,搞清楚一个算法的执行顺序是真的很重要。

就你dfs的顺序还有维护的东西这两个东西你需要再次理解清楚一下。
dfs就是dfs,一定要清楚dfs执行的顺序。
深度就是父亲的深度+1这没什么好说的。

但是高度。是所有儿子结点的最大高度+1。这个点其实是有点像dp的,从最小的一层开始。一直往上运算。

#include<bits/stdc++.h>

using namespace std;

const int N = 1e5+10;

vector<int> v[N];
int n;
int shen[N];
int gao[N];

void dfs(int a,int fa){
    shen[a] = shen[fa] + 1;
    gao[a] = 1;
    for(auto it:v[a]){
        if(it == fa)continue;
        dfs(it,a);
        gao[a] = max(gao[a],gao[it] + 1);
    }
}

int main(){
    
    cin>>n;
    
    for(int i=0;i<n-1;i++){
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    
    dfs(1,0);
    
    int cnt = 0;
    
    for(int i=1;i<=n;i++){
        if(gao[i] == shen[i])cnt++;
    }
    cout<<cnt<<endl;
    
    for(int i=1;i<=n;i++){
        if(gao[i] == shen[i])cout<<i<<" ";
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值