階段1 樹的直徑 改邊權 巡邏

2021-10-10 03:30:53 字數 1484 閱讀 7343

【題意】

在乙個地區有 n 個村莊,編號為1,2,…,n。

有 n-1 條道路連線著這些村莊,每條道路剛好連線兩個村莊,從任何乙個村莊,都可以通過這些道路到達其他任乙個村莊。

每條道路的長度均為1個單位。

為保證該地區的安全,巡警車每天都要到所有的道路上巡邏。

警察局設在編號為1的村莊裡,每天巡警車總是從警局出發,最終又回到警局。

為了減少總的巡邏距離,該地區準備在這些村莊之間建立 k 條新的道路,每條新道路可以連線任意兩個村莊。

兩條新道路可以在同乙個村莊會合或結束,甚至新道路可以是乙個環。

因為資金有限,所以 k 只能為1或2。

同時,為了不浪費資金,每天巡警車必須經過新建的道路正好一次。

編寫乙個程式,在給定村莊間道路資訊和需要新建的道路數的情況下,計算出最佳的新建道路的方案,使得總的巡邏距離最小。

【輸入格式】

第一行包含兩個整數 n 和 k。

接下來 n-1 行每行兩個整數 a 和 b,表示村莊 a 和 b 之間有一條道路。

【輸出格式】

輸出乙個整數,表示新建了 k 條道路後能達到的最小巡邏距離。

【資料範圍】

3≤n≤100000

1≤k≤2

1≤a,b≤n

【輸入樣例】

8 11 2

3 13 4

5 37 5

8 55 6

【輸出樣例】

11

定義:給定一棵樹,樹中的每一條邊都有乙個權值,樹中兩點的距離定義為連線這兩點的路徑上的邊權之和。樹中最遠的兩個節點之間的距離被稱作樹的直徑

求法(樹形dp):

void dp(int x,int fa)

}

我們發現了乙個規律:如果一條邊都不新增,巡邏時,樹上的每一條邊都要走兩遍

如果我們新增一條邊(x,y),那麼原本x到y路徑上的所有邊連上這條新加的邊就構成了乙個環,環上的所有邊只需要走一遍,巡邏距離即為,樹的直徑長度+1

所以當k=1的時候,我們直接選擇在樹直徑的兩端連邊,這樣這直徑上的邊就只用走一遍。答案為:2*(n-1)-val+1,(其中val為樹直徑的長度)

然而當k=2的時候,我們不能直接這麼操作。

因為新增兩條邊所形成的兩個環有兩種情況:

1.兩個環沒有重疊部分,這個好辦,相當於執行兩次k=1的情況

2.兩個環有重疊部分,那麼非重疊部分只有走一遍,而重疊部分要走兩邊

所以,我們要進行兩次詢問樹直徑的操作

第一次詢問完後將樹的直徑上的權值取反,第二次再詢問一遍即可

巡邏 樹的直徑的3種求法

1.最樸素的求法 列舉每乙個點作為起點找到離它最遠的那個點 dfs 取每個點的最長路徑的max 時間複雜度 o n n 這裡不貼咯 2.樹形dp 對於點作為根,它的最長路徑是他的最長路徑和次長路徑的和。所以對數進行樹形dp dp x 0 最長,dp x 1 次長。dp x 1 dp x 0 即為以此...

SDOI2013 直徑(樹的直徑必經邊)

題目傳送 sol 先求出任一直徑同時把直徑拎出來,樹的非直徑部分全部掛在直徑上 如下 對於直徑上的每乙個點i,如果存在它到非直徑上點的最大距離 g i 等於它到直徑兩端點中較短的那一段 d i 則說明這一段也可以成為直徑中的一部分。而我們需要得到所有直徑的交,畫圖可以發現假設兩端 以中點為界 都存在...

dfs 樹的直徑 Jzoj P1737 刪邊

description 給出n個點,n 1條邊的連通圖.現要求刪除一條邊,使得連通塊的直徑總和最大.所謂連通塊的直徑是指連通塊中最遠兩點之間的距離。問 直徑總和最大是多少?input 檔名為 delete.in 第一行正整數n.接下來n 1行.每行兩個數,a,b,len表示a,b 1 a,b n 有...