树的直径是树形结构上距离最长的路径
树的直径一些性质:
1.与树上任意一点x最远的点一定是直径的两端
2.在树上找到一点,其他点到这个点的距离最大值最小,最大值=直径/2+直径%2
3.任选一点,找到最远的点,该点必是直径一端,从该点找最远的另一点,另一点必是直径的另一端
4.树上:最短欧拉路=2*树的所有边长和-树的直径
由1->3
解析:
方法1:
直接求出直径的两端,从两端遍历出结果取最大值
二次搜索出结果
ac:
#include<bits/stdc++.h>
#define MAXN 200005
#define ll long long
using namespace std;
int to[MAXN<<1],head[MAXN<<1],nxt[MAXN<<1],val[MAXN<<1];
int tot=0;
int v1;
ll mins;
void init()
{
mins=0;
memset(head,0,sizeof(head));
tot=0;
}
void add(int u,int v,int w)
{
to[++tot]=v;
val[tot]=w;
nxt[tot]=head[u];
head[u]=tot;
}
void dfs(int x,int fa,ll dis)
{
if(dis>mins)
mins=dis,v1=x;
for(int i=head[x];i;i=nxt[i])
{
int v=to[i];
if(v==fa)