就,真的,顺序很重要,不只是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<<" ";
}
}