前言:
樹的直徑指樹上距離最遠的兩點間的距離,它在樹上問題上有許多應用,往往通過樹的直徑的性質可以將一個高時間復雜度的解法變為線性求解。對於樹上兩點間距離通常有三種定義,我們根據這三種情況分別討論一下它的性質。
樹的直徑的求法:
樹的直徑有兩種求法,時間復雜度都是$O(n)$。
貪心求法:
貪心求直徑的方法是任意找一個點為根,dfs整棵樹找到距離他最遠的點$x$,再以這個點$x$為根求出距離它最遠的點$y$,$(x,y)$即為直徑。證明后面再說。
DP求法:
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$的深度深,所以手畫一下就能看出來。
性質:
1、直徑兩端點一定是兩個葉子節點
2、距離任意點最遠的點一定是直徑的一個端點,這個基於貪心求直徑方法的正確性可以得出
3、對於兩棵樹,如果第一棵樹直徑兩端點為$(u,v)$,第二棵樹直徑兩端點為$(x,y)$,用一條邊將兩棵樹連接,那么新樹的直徑一定是$u,v,x,y,$中的兩個點
證明:如果新樹直徑不是原來兩棵樹中一棵的直徑,那么新直徑一定經過兩棵樹的連接邊,新直徑在原來每棵樹中的部分一定是距離連接點最遠的點,即一定是原樹直徑的一個端點。
4、對於一棵樹,如果在一個點的上接一個葉子節點,那么最多會改變直徑的一個端點
證明:假設在$x$下面接一個點$y$,直徑變成了$(u,x)$,原樹直徑為$(a,b)$,那么$dis(u,x)>dis(a,b),dis(u,x)=dis(u,y)+1$,即$dis(u,y)+1>dis(a,b)$,如果$dis(u,y)<dis(a,b)$,那么顯然不成立;如果$dis(u,y)=dis(a,b)$,那么$(u,y)$也是原樹的直徑,符合上述結論。
5、若一棵樹存在多條直徑,那么這些直徑交於一點且交點是這些直徑的中點
二、
定義樹的直徑為兩點間路徑上邊權和+兩點點權和,點權可以為負數,邊權非負。
這種情況滿足貪心求法及上述2、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)$的結論
三、
定義樹的直徑為兩點間路徑上邊權和,邊權有負數。
這種情況無法用貪心方法求直徑,並且不具備以上性質。