专栏文章
树的直径
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioigdmv
- 此快照首次捕获于
- 2025/12/02 19:44 3 个月前
- 此快照最后确认于
- 2025/12/02 19:44 3 个月前
CPP
//众所周知,树的直径简单来说即是树上边权和最大的路径
//ta的查找方法是:
// 1.先从任意一点出发,找到离这个点最远的地方 ,记为begin
// 2.从 begin出发,找到离 begin最远的点,记为end
// 3.同时记录 begin—end的边权之和,即为答案
#include<bits/stdc++.h>
using namespace std;
int n,u,v,node,dep[(int)1e5+5],maxx=-1;
vector<int> tr[(int)1e5+5];//vector存图
void dfs(int x,int f){//x 表示当前节点,f表示其父亲
for(auto ne:tr[x]){ //遍历tr[x]的儿子,ne表示遍历到的tr[x]的每一个儿子
if(ne==f) continue;//不能往回走(儿子不能走向父亲,不然死循环)
dep[ne]=dep[x]+1;//递推更新儿子节点深度
dfs(ne,x);//dfs
}
if(dep[x]>maxx){//找最远距离
maxx=dep[x];
node=x;//找最远节点
}
}
int main(){
cin>>n;
for(int i=1;i<=n-1;i++){
cin>>u>>v;
tr[u].push_back(v); //vector存双向边
tr[v].push_back(u);
}
dfs(1,0); //第一遍dfs完成步骤1
memset(dep,0,sizeof(dep));//注意清空统计需要用的量
maxx=-1;
dfs(node,0);//dfs同理,完成步骤2
cout<<dep[node]<<'\n';//由于第二遍dfs是从begin为根开始的,因此end的深度即为所求
return 0;
}
//学长现敲,完结撒花 ~
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...