每日摄影(河南开封清明上河园国际菊花展):

代码(dfs)
cpp
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int h[maxn],ne[maxn],e[maxn],idx=0;
int n,m,dep[maxn],ans;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
//链式前向星
void dfs(int n,int m){
for(int i=h[n];~i;i=ne[i]){
int j=e[i];
if(j==m) continue;
dep[j]=dep[n]+1;
ans=max(ans,dep[j]);
dfs(j,n);
}
}
//dfs
int main(){
memset(h,-1,sizeof h);
//不可省略
cin>>n>>m;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
add(a,b),add(b,a);
//无向图
}
dfs(m,-1);
//dfs(子节点,父节点)
cout<<ans;
return 0;
}
/*
in:
5 5
1 2
1 4
1 5
2 3
out:
3
*/
核心代码批注(dfs函数):
|-----------------------------------|---------------------|
| 代码 | 批注 |
| for(int i=h[n];~i;i=ne[i]){} | 遍历所有与n相连的节点(n的子节点) |
| int j=e[i]; | j为本次循环所取的n的子节点 |
| if(j==m) continue; | 判断j是否为n的父节点m(避免死循环) |
| dep[j]=dep[n]+1; | 更新j的深度(为父节点n的深度加1) |
| ans=max(ans,dep[j]); | 更新最大值 |
| dfs(j,n); | 以j为子节点,为n父节点进行递归深搜 |
| | |
| | |
相关链接:
题目代码: AcWing 3699:树的高度 ← dfs+链式前向星-CSDN博客
链式前向星代码: yxc 图示"链式前向星"核心操作_链式前向星图示-CSDN博客
题目链接: 3699. 树的高度 - AcWing题库