某個國家有n個城市,這n個城市中任意兩個都連通且有唯一一條路徑,每條連通兩個城市的道路的長度為zi(zi<=1000)。
這個國家的人對火焰有超越宇宙的熱情,所以這個國家最興旺的行業是消防業。由於**對國民的熱情忍無可忍(大量的消防經費開銷)可是卻又無可奈何(**競選的國民支援率),所以只能想盡方法提高消防能力。
現在這個國家的經費足以在一條邊長度和不超過s的路徑(兩端都是城市)上建立消防樞紐,為了盡量提高樞紐的利用率,要求其他所有城市到這條路徑的距離的最大值最小。
你受命監管這個專案,你當然需要知道應該把樞紐建立在什麼位置上。
輸入包含n行:
第1行,兩個正整數n和s,中間用乙個空格隔開。其中n為城市的個數,s為路徑長度的上界。設結點編號以此為1,2,……,n。
從第2行到第n行,每行給出3個用空格隔開的正整數,依次表示每一條邊的兩個端點編號和長度。例如,「2 4 7」表示連線結點2與4的邊的長度為7。
輸出包含乙個非負整數,即所有城市到選擇的路徑的最大值,當然這個最大值必須是所有方案中最小的。
【資料規模和約定】
對於20%的資料,n<=300。
對於50%的資料,n<=3000。
對於100%的資料,n<=300000,邊長小等於1000。
對於消防局的建設的地點,選擇在樹的直徑上是最優的。
樹的直徑:樹中的最長簡單路
假設消防局為黃鏈\(a\)(\(a\)不在\(d\)上),其中有點\(a_1\),\(a_2\)......\(a_n\),樹的某一直徑為藍鏈\(d\),兩邊的點分別為\(d_1\),\(d_2\)
則對於點\(a_i\)來說,在整顆樹中最遠的點即為\(d_1\)或\(d_2\)
證明(證明中的證明):
假設存在\(s_2\)使得\(d_3\)距離ai最遠,則必有\(s_2+s_1>s_4\)(或\(s_3\)),即產生了新的直徑,不成立,得證。
由以上可知,黃鏈上的點到外面最遠的乙個點的距離為
\(dis=min\\)
若令\(dis\)最小,則鏈\(a\)必在鏈\(d\)上。
但是,當\(a\)在\(d\)上時,鏈\(a\)到外面的點(即不在直徑上的點)的距離\(f\)是可能大於\(dis\)的,是合法的。
這樣是否矛盾?
不矛盾,因為任何乙個在外面的鏈\(a\)的\(dis\)都是大於在直徑上的鏈\(a\)的\(f\)的
其實不太嚴謹哈
那麼對於這個題,我們就有了思路啊
2次dfs求出樹的直徑(第一次求出某條直徑端點,第二次直接抽出直徑)
預處理直徑上每個點\(i\)向外延伸的最長距離\(c[i]\)
對於待檢驗鏈\(a\),左端為\(a_i\),右端為\(a_j\),此時的最長距離即為\(max\\)
前兩個好弄,字首和就行。
後乙個是\(rmq\)問題,\(st\)表線段樹維護一下就行。
但還有個更優的,我們注意到我們相當於拿乙個視窗劃過了鏈\(a\),對啊,妥妥的單調佇列維護啊
code:
#include #include #include #include #include #include using namespace std;
const int n=300010;
int n,s;
int used[n];
struct node1
node1(int i,int w)
};deque q;
struct node
node(int i,int w)
};vector g[n];
int l,m_max=0;
int son[n],ww[n];
int c[n];//節點i外面的最長邊
void dfs0(int now,int len)}}
}int dfs(int now)
{ int mmax=0;
used[now]=1;
for(int i=0;i>n>>s;
int u,v,w;
for(int i=1;iq.front().w) q.pop_front();
q.push_front(tt);
while(f[ll]-f[i]>s)
{ll++;
if(q.back().i結論:
2018.4.27
P2491 消防 P1099 樹網的核
雙倍經驗,雙倍快樂。在乙個樹上選擇一段總長度不超過 s 的鏈使所有點到該鏈距離的最大值最小。輸出這個最小的值。define 以下 s 指鏈或鏈長。證明一下 s 一定處於直徑上。假設它不在直徑上,一定存在直徑的其中乙個端點到 s 的距離大於現在所處支鏈的最大距離。所以 s 不在直徑上一定不優。於是我們...
洛谷P3372解題報告
題目描述如下 在這裡插入描述 由於是一道模板題就直接給注釋詳細的 include includeusing namespace std typedef long long ll long long int sum 0ll struct node tree 500005 void build ll l...
洛谷P1342 請柬解題報告
求去的路徑與回來的路徑和 1 n m 1000000 1 le n,m le 1000000 1 n,m 1000 000最短路 對於第一次碰到這種模型的oiers,這個地方可以講講的。顯然我們可以暴力跑n遍最短路。但是我們可以這麼想 我們出去是從乙個點到所有其他點,那麼我們能回來也從乙個點到所有其...