怎么找树的直径的2个端点和求树的直径:
首先以任意一个点为起点进行一次dfs搜索
记录下每一个点的与该点的距离dis
距离该点最远的点是树的一个端点x
然后以端点x为起点再进行一次dfs
这时候dis最大的就是另一个端点y
然后dis[y]就是我们要的答案
证明y总提高课有讲~
我只是贴一下我这种写法的代码 大家以后好利用
#include<algorithm>
#include<cstring>
using namespace std;
#define N 10010
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Edge{
int next,v,w;
}edge[N<<1];
int head[N],tot=0,dis[N];
void adde(int u,int v,int w){
edge[++tot].next=head[u];
edge[tot].v=v;
edge[tot].w=w;
head[u]=tot;
}
void dfs(int u,int fa,int cnt){
dis[u]=max(cnt,dis[u]);//以x,y为根进行2次dfs可以用来求任意一点与自己最远的点的距离
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
int w=edge[i].w;
if(v!=fa)
dfs(v,u,cnt+w);
}
}
int main(){
int n=read();
for(int i=1;i<n;i++){
int u=read(),v=read(),w=read();
adde(u,v,w);
adde(v,u,w);
}
dfs(1,1,0);
int res=0,x=1;;
for(int i=1;i<=n;i++){
if(res<dis[i]){//找出端点x
res=dis[i];
x=i;
}
}
memset(dis,0,sizeof(dis));//将先前的清0
dfs(x,x,0);
for(int i=1;i<=n;i++){
res=max(dis[i],res);//可以用if的比较方式找出另一个端点y
}
cout<<res;
}
学长写的真好 %%%
cnt是指什么?
记录x点到该点的路径长度