一般解法是两次搜索,第一次求离根节点最远的点A,第二次求里点A最远的点B。
A与B之间的距离就是树的直径。
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,d[N]={-1},deepest;
vector<int> edges[N]; // vector存图
void add(int u,int v) { edges[u].push_back(v); } // 简单加边
void dfs(int now,int fa) {
d[now]=d[fa]+1; // 深度=父亲+1
if (d[now]>d[deepest]) deepest=now; // 获取最深节点
for (int i=0,v;i<edges[now].size();i++) // 遍历每一条边
if ((v=edges[now][i])!=fa) dfs(v,now); // 如果是father就可以不用dfs
}
int main() {
cin>>n;
for (int i=1,u,v;i<n;i++) cin>>u>>v,add(u,v),add(v,u); // 双向加边
dfs(1,0),dfs(deepest,0); // 二次dfs
cout<<d[deepest]<<endl; // 最深节点的d就是答案
return 0;
}