1. 程式人生 > >[SDOI2011]消防(樹的直徑+二分||單調隊列)

[SDOI2011]消防(樹的直徑+二分||單調隊列)

個數 要求 大量 應該 輸入輸出格式 正整數 app article 端點

題目描述

某個國家有n個城市,這n個城市中任意兩個都連通且有唯一一條路徑,每條連通兩個城市的道路的長度為zi(zi<=1000)。

這個國家的人對火焰有超越宇宙的熱情,所以這個國家最興旺的行業是消防業。由於政府對國民的熱情忍無可忍(大量的消防經費開銷)可是卻又無可奈何(總統競選的國民支持率),所以只能想盡方法提高消防能力。

現在這個國家的經費足以在一條邊長度和不超過s的路徑(兩端都是城市)上建立消防樞紐,為了盡量提高樞紐的利用率,要求其他所有城市到這條路徑的距離的最大值最小。

你受命監管這個項目,你當然需要知道應該把樞紐建立在什麽位置上。

輸入輸出格式

輸入格式:

輸入包含n行:

第1行,兩個正整數n和s,中間用一個空格隔開。其中n為城市的個數,s為路徑長度的上界。設結點編號以此為1,2,……,n。

從第2行到第n行,每行給出3個用空格隔開的正整數,依次表示每一條邊的兩個端點編號和長度。例如,“2 4 7”表示連接結點2與4的邊的長度為7。

輸出格式:

輸出包含一個非負整數,即所有城市到選擇的路徑的最大值,當然這個最大值必須是所有方案中最小的。

輸入輸出樣例

輸入樣例#1: 復制
5 2
1 2 5
2 3 2
2 4 4
2 5 3
輸出樣例#1: 復制
5
輸入樣例#2: 復制
8 6
1 3 2
2 3 2 
3 4 6
4 5 3
4 6 4
4 7 2
7 8 3
輸出樣例#2: 復制
5

說明

【數據規模和約定】

對於20%的數據,n<=300。

對於50%的數據,n<=3000。

對於100%的數據,n<=300000,邊長小等於1000。






最重要的一點就是路徑一定全都在樹的直徑上,至於證明就自行百度吧嘿嘿:

確定直徑的兩個端點 l 和 r ,維護直徑上的每個點到達的最遠的點的距離(不包括直徑上的點),要麽二分最大值,吧兩個端點向裏縮

1

[SDOI2011]消防(樹的直徑+二分||單調隊列)