一.樹直徑的定義.
顯然一棵樹可以有不止一條直徑.
二.樹直徑的求解.
一般來說樹的直徑可以用樹形dp來求.
設f [i
][0/
1]f[i][0/1]
f[i][0
/1]表示在i
ii的子樹中以i
ii為一端的最長/
//次長鏈長度,我們可以很容易dp出來這個值,樹的直徑就是f[i
][0]
+f[i
][1]
f[i][0]+f[i][1]
f[i][0
]+f[
i][1
]的最大值.
同時我們還可以在dp的時候記錄一下f[i
][0/
1]f[i][0/1]
f[i][0
/1]對應的從i
ii連向兒子的邊,這樣就可以求樹的直徑的方案了.
時間複雜度o(n
)o(n)
o(n)
.若不帶方案的話,在dp的時候可以不用將次長鏈記錄下來,直接在更新當前最長鏈之前用原來的最長鏈和現在的鏈拼接一下更新答案即可.
不帶方案的版本如下:
int dp[n+9]
;int
dfs_dp
(int k,
int fa)
return res;
}
不過一旦帶上方案,上面的做法就不行了,因為方案需要用到lca次長鏈對應的兒子.
帶方案的版本如下:
int dp[n+9]
[2],pre[n+9]
[2];
void
update
(int k,
int id)
else
if(v>dp[k][1
]) dp[k][1
]=v,pre[k][1
]=id;
}int
dfs_dp
(int k,
int fa)
return
max(res,dp[k][0
]+dp[k][1
]);}
int dia[n+9]
,v[n+9]
,cd;
intget_dia()
三.非負邊權樹上的直徑求解.注意接下來所有的結論都不一定適用於負邊權樹.對於邊權非負的樹,我們還有另一種求解的方法.
具體來說,我們可以先從任意乙個點開始,找到距離這個點最遠的那個點;再從我們找到的點開始,在找到距離這個點最遠的點.此時兩個最遠點為端點的路徑就是這棵樹的一條直徑.
找最遠點的過程可以用dfs或者bfs實現,時間複雜度o(n
)o(n)
o(n)
.帶方案版本的**如下:
queue<
int>q;
int dis[n+9]
,pre[n+9]
,vis[n+9]
;void
bfs_dis
(int st)}}
int dia[n+9]
,v[n+9]
,cd;
intget_dia()
正確性證明:
假設第一次從黑點出發找到最遠點為藍點,但存在一條路徑端點為兩個紅點更長,且藍點到黑點路徑上有綠點與紅點到紅點路徑上的某個橙點相連(可以是同乙個點).
那麼此時兩個紅點到綠點的距離均沒有藍點到綠點的距離大,那麼此時乙個紅點到藍點的距離必然比它到另乙個紅點的距離大,與條件矛盾,原命題得證.
證畢.通過這個證明過程我們也得到了乙個非負邊權樹上直徑的性質.
性質1:對於樹上任意乙個點出發的最長鏈,其另外乙個端點必然是某條直徑的端點.
四.非負邊權樹上直徑交的性質.
性質2:對於一棵邊權非負的樹,這棵樹的所有直徑必然交於一點.
證明:
假設我們已經證明了某些直徑交於藍點,現在有一條兩端為黑點的直徑,且這條直徑上有乙個綠點與藍點相連,並且有經過藍點的某條直徑為紅點.
此時必然有某個紅點到藍點的距離與某個黑點到綠點的距離大於等於直徑長度的一半,那麼這個紅點與這個黑點之間的距離就會大於直徑長度,與條件矛盾,原命題得證.
證畢.這個性質可以用來求所有直徑的交,具體可以參考bzoj3124 直徑題解.
性質3:一條直徑的中點(可能在邊上)必然在其它直徑上出現,且這個中點也是其它直徑的中點.
證明:
假設有一條兩端為藍點的直徑且中點為綠點,並有一條兩端為黑點的直徑與兩端為藍點的直徑的交的兩端為紅點.
此時右邊紅點到右邊藍點的距離必定大於直徑長度的一半,且上面黑點到右邊紅點的距離和下面黑點到右邊紅點的距離中必定也有乙個大於直徑長度的一半,加起來大於直徑長度,與直徑定義矛盾,原命題得證.
證畢.五.一些非負邊權樹上的其它性質.
下面的性質比較簡單,將不再證明.
性質5:對於一棵樹,若原來它的直徑端點為(x,
y)(x,y)
(x,y
),此時給它加乙個點z
zz使得它仍然是一棵樹,則這棵樹的直徑的兩個端點為x,y
,zx,y,z
x,y,
z中的兩個,且直徑增加的長度.
性質6:對於兩棵樹的直徑分別為(x,
y),(
u,v)
(x,y),(u,v)
(x,y),
(u,v
),若給它們之間連一條邊並成一棵新樹,則新樹的兩個端點必然為x,y
,u,v
x,y,u,v
x,y,u,
v中的兩個.
SDOI2013 直徑(樹的直徑)
小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...
樹的直徑 板子
不帶解釋版模板o n 常數較大,但是可以知道樹上每一點到直徑端點的距離,這個大多時候都很有用 struct node e maxn 2 ll dis1 maxn dis2 maxn int st,ed,max len void dd int u,int fa,int len,int flag fil...
樹的直徑總結
1.樹的直徑的求法不是很難,兩遍dfs,樹的直徑又稱為最長路,沒看到樹的直徑的裸題,除了飯店的那個題,講的是有一家飯店在乙個圖中,飯店的送餐時間與最遠的送餐距離成正比,求飯店的修建位置使得飯店的送餐時間最短,那麼這個題就是說在圖中趙找一條最長路,將飯店建在最長路的中心,這個題也是ccpc2019網路...