树的直径指树上距离最远的两点间的距离,它在树上问题上有许多应用,每每经过树的直径的性质能够将一个高时间复杂度的解法变为线性求解。对于树上两点间距离一般有三种定义,咱们根据这三种状况分别讨论一下它的性质。spa
树的直径有两种求法,时间复杂度都是$O(n)$。方法
贪心求直径的方法是任意找一个点为根,dfs整棵树找到距离他最远的点$x$,再以这个点$x$为根求出距离它最远的点$y$,$(x,y)$即为直径。证实后面再说。di
DP求直径的方法是对于每一个点记录这个点子树中的最长链及与最长链处于不一样子树中的次长链,用每一个点的最长链+次长链更新直径,而后再将最长链上传到父节点更新父节点的最长链或次长链。这种求法适用于全部求树的直径的状况。时间
定义两点间距离为两点间路径上的边权和,边权非负。上传
贪心求直径的方法适用于这种树的直径。
假设肯定了直径的一个端点,那么另外一个端点必定是距离这个端点最远的点,因此第二次找最远点的贪心必定正确。咱们采用反证法,假设第一次从$a$开始找,找到的点是$x$,而存在一个点$u$使得以$u$为根找最远点$v$造成的直径要比以$x$为根找最远点造成的直径长。假设两点间距离用$dis$表示
若是$(x,u)$的路径与$(u,v)$的路径不相交,$dis(x,u)+dis(u,v)$必定比$dis(u,v)$长,假设不成立。
若是$(x,u)$的路径与$(u,v)$的路径相交,假设两路径的另外一交点为$y$,那么$dis(x,y)>dis(u,y)$,由于以$a$为根时$x$的深度比$u$的深度深,因此手画一下就能看出来。
一、直径两端点必定是两个叶子节点
二、距离任意点最远的点必定是直径的一个端点,这个基于贪心求直径方法的正确性能够得出
三、对于两棵树,若是第一棵树直径两端点为$(u,v)$,第二棵树直径两端点为$(x,y)$,用一条边将两棵树链接,那么新树的直径必定是$u,v,x,y,$中的两个点
四、对于一棵树,若是在一个点的上接一个叶子节点,那么最多会改变直径的一个端点
五、若一棵树存在多条直径,那么这些直径交于一点且交点是这些直径的中点
定义树的直径为两点间路径上边权和+两点点权和,点权能够为负数,边权非负。
这种状况知足贪心求法及上述二、3性质,一样证实一下贪心求法及性质2:
能够发现性质二知足的缘由是贪心求法的成立,因此只须要证实贪心的成当即可。
假设第一次dfs以$a$为根,深度+点权的最大点为$x$,假设存在一个更优势$u$使得从$u$开始找最远点$y$造成的直径比从$x$找最远点造成的直径长,令$x$与$u$到根的路径不交集部分长度分别为$l(x),l(u)$,两点点权分别为$v(x),v(u)$,那么$l(x)+v(x)>l(u)+v(u)$。
若是$(u,y)$与$(x,u)$不相交,那么显然$v(x)+l(x)+l(u)>v(u)$,$dis(x,u)+dis(u,y)+v(x)+v(y)>dis(u,y)+v(u)+v(y)$
若是$(u,y)$与$(x,u)$相交,假设两路径交点为$b$,那么也能够得出$dis(b,x)+v(x)>dis(b,u)+v(u)$的结论
定义树的直径为两点间路径上边权和,边权有负数。
这种状况没法用贪心方法求直径,而且不具有以上性质。