洛谷P3761 TJOI2017 城市

2022-02-27 07:00:15 字數 2026 閱讀 8755

從加里敦大學城市規劃專業畢業的小明來到了乙個地區城市規劃局工作。這個地區一共有ri座城市,《-1條高速公路,保證了任意兩運城市之間都可以通過高速公路相互可達,但是通過一條高速公路需要收取一定的交通費用。小明對這個地區深入研究後,覺得這個地區的交通費用太貴。小明想徹底改造這個地區,但是由於上司給他的資源有限,因而小明現在只能對一條高速公路進行改造,改造的方式就是去掉一條高速公路,並且重新修建一條一樣的高速公路(即交通費用一樣),使得這個地區的兩個城市之間的最大交通費用最小(即使得交通費用最大的兩座城市之間的交通費用最小),並且保證修建完之後任意兩座城市相互可達。如果你是小明,你怎麼解決這個問題?

輸入格式:

輸入資料的第一行為乙個整數n,代表城市個數。

接下來的n - 1行分別代表了最初的n-1條公路情況。每一行都有三個整數u,v,d。u,v代表這條公路的兩端城市標號,d代表這條公路的交通費用。

1 <= u,v <= n,1<= d <= 2000

輸出格式:

輸出資料僅有一行,乙個整數,表示進行了最優的改造之後,該地區兩城市 之間最大交通費用。

輸入樣例#1:

51 2 1

2 3 2

3 4 3

4 5 4

輸出樣例#1:

對於30%的資料,1<=n<500

對於100%的資料,1<=n<=5000

一句話題意:給出一顆樹,現在可以斷開一條邊並重新選擇乙個位置連線使得這張圖仍然是一棵樹.

題解:因為在一棵樹上斷掉一條邊之後,一定會成為兩個連通塊.那麼再在這兩個連通塊中連一條邊,兩個連通塊重新組成一棵樹,那麼這時樹中的最長的距離就是新組成的直徑.

那麼新組成的直徑該怎麼計算呢?

顯然我們可以分情況討論:

斷開一條邊後形成的兩個連通塊中一條直徑比較長,另一條直徑比較短,將直徑短的那顆樹接到直徑較長的樹中後新樹的直徑仍然小於之前較長的直徑.

兩條直徑差不多長,無論怎麼接都會增加長度.此時我們需要它增加的長度盡量小,那麼顯然是要將兩根直徑的一半的位置接起來.此時直徑可能不能恰好分成平均的兩段,我們需要取折半後的較長段的最小值作為半徑(想一下為什麼).

那麼這樣就將所有的合併情況都討論出來了,我們只需要列舉每一條邊斷開然後取合併後的最小值就可以了.

#includeusing namespace std;

const int n = 5000+5;

const int inf = 2147483647;

int n, ecnt = 1, last[n], ans = inf, f[n], fa[n], q[n], cnt, dist[n], pre[n], dep[n];

int len[2], l[2], r[2];

struct edgee[n*2];

void add(int x, int y, int z)

void dfs(int x, int las, int deep, int k)

}void get_dis(int x, int lca)

get_dis(fa[x], lca), q[++cnt] = x;

}int get(int x, int y)

while(x != lca) q[++cnt] = x, x = fa[x]; get_dis(y, lca);

for(int i=2;i<=cnt;i++)

for(int j=last[q[i]];j;j=e[j].nex)

if(e[j].to == q[i-1]) dist[q[i]] = dist[q[i-1]]+e[j].w;

for(int i=1;i<=cnt;i++) mn = min(mn, max(dist[q[i]], dist[q[cnt]]-dist[q[i]]));

return mn;

}void solve(int x, int y, int w)

int main()

題解 P3761 TJOI2017 城市

update 2020 7 15 優化了一下 markdown 的用法,增加了前面的題目描述。從加里敦大學城市規劃專業畢業的小明來到了乙個地區城市規劃局工作。這個地區一共有 n 座城市,n 1 條高速公路,保證了任意兩運城市之間都可以通過高速公路相互可達,但是通過一條高速公路需要收取一定的交通費用。...

洛谷3761,TJOI2017城市

這道題一開始在想可以列舉每個點對,嘗試刪除其間的邊,因為有o n2 個點對,所以要o 1 更新答案 後來發現,因為是樹,所以只有o n 個點對是有用的 這麼顯然的結論一開始沒發現,看來還是我太弱了 然後就可以每次o n 判斷 首先定義在一棵樹 x 中,對於點y,f x,y 等於以 y 為根的有根樹,...

洛谷P3758 TJOI2017 可樂

加里敦星球的人們特別喜歡喝可樂。因而,他們的敵對星球研發出了乙個可樂機械人,並且放在了加里敦星球的1號城市上。這個可樂機械人有三種行為 停在原地,去下乙個相鄰的城市,自爆。它每一秒都會隨機觸發一種行為。現 在給加里敦星球城市圖,在第0秒時可樂機械人在1號城市,問經過了t秒,可樂機械人的行為方案數是多...