洛谷 P2491消防 解題報告

2022-04-30 06:48:08 字數 2185 閱讀 5155

某個國家有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遍最短路。但是我們可以這麼想 我們出去是從乙個點到所有其他點,那麼我們能回來也從乙個點到所有其...