树的直径即树上最大长度,可以用两次dfs或者bfs求解
证明如下:
设树上有s,t,u,v四点,路径s-t是最长路径,从u点出发
1.u点在s-t路径上,第一次就会找到距u最远的s或t点,第二次就会找到s-t路径;
若第一次找到距u点最远的点是v,那么dis[u][v]>max(dis[s][u],dis[t][u]),则dis[s][t]<max(dis[s][v],dis[t][v]),与假设相悖
2.u点不在s-t路径上,证明同上
模板:
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
struct edge
{
int des,val;
edge(int b,int c):des(b),val(c) { }
};
vector<edge> vn[10005];
bool vis[10005];
int n,final,ans=0;
void dfs(int s,int dis)
{
vis[s]=true;
if(dis>ans)
{
ans=dis;
final=s;
}
for(int i=0;i<vn[s].size();i++)
{
if(!vis[vn[s][i].des])
{
dfs(vn[s][i].des,dis+vn[s][i].val);
}
}
}
int main()
{
cin >> n;
for(int i=0;i<n-1;i++)
{
int a,b,c;
cin >> a >> b >> c;
vn[a].push_back(edge(b,c));
vn[b].push_back(edge(a,c));
}
memset(vis,0,sizeof(vis));
dfs(1,0);
memset(vis,0,sizeof(vis));
ans=0;
dfs(final,0);
cout << ans;
return 0;
}