戰略威懾 51nod提高組試題

2022-02-13 08:49:48 字數 1880 閱讀 4960

ac通道

馬奧雷利亞諾布恩迪亞上校發動了他的第三十二次戰爭,讓我們祝他好運。

馬孔多附近有n個城市, 有n-1條雙向道路連通這些城市。上校想通過摧毀兩條公路的方式對當局予以威懾。但是上校的老師 告訴他為了戰略目的這兩條路不可以有共同的城市。這次行動對當局的威懾效果將等於兩條路徑的長 度的乘積。假設每條道路的長度等於1,並且路徑的長度等於道路的數量。請你幫上校造成最大的威 懾。

單組測試資料。第一行是乙個整數 n (2≤n≤200) ,n是這個馬孔多附近城市的數量。接下來n-1行是 道路的資訊,每一行是兩個整數ai,bi,它們是城市的編號,表示ai和bi之間有一條道路直接連通。 (1≤ai,bi≤n)

輸出最大的威懾

輸入 #1複製

4

1 22 3

3 4

輸出 #1複製

1

輸入 #2複製

2

2 1

輸出 #2複製

0

輸入 #3複製

6

1 22 3

2 45 4

6 4

輸出 #3複製

4

對於35%的資料, n <= 10 對於75%的資料, n <= 100 對於100%的資料, n <= 200

思路十分簡單,直接列舉每條邊,將其刪掉,形成兩棵樹,以兩邊的定點為起點分別找樹的直徑。

???

so,why is this right?

如此考慮:

題目中要求我們路徑上不能有交叉,同時長度要盡量大。

對於條件2,很容易想到求樹的直徑。對於條件1,可以如此模擬:

要使得路徑盡量長,就要走過盡可能多的邊。那麼,最好的方法是什麼?

讓兩條道路相差的盡可能不遠。既然如此,那麼最不遠的兩個點是什麼點?

一條邊的兩個端點。於是,斷開這條邊防止交叉,然後求分別跑樹的直徑即可。

ac利器:

#includeusing

namespace

std;

#define n 1010

#define ll long long

/*斷開一條邊後分成兩棵樹,求兩棵樹的直徑

*/inline

intread()

while

(isdigit(c))

return x *s;

}struct

nodet[n];

intf[n];

bool

vis[n];

intdp[n];

int ans = 0, temp = 0, temp1 = 0

;int bian = 0

;inline

void add(int u, int

v)void dfs(int

now)

}return

;

}int

main()

for(int i= 1;i <= bian;i += 2

) cout

<< ans

}

賽艇表演 51nod提高組模擬試題

ac通道 題目描述 小明去某個地區 賽艇比賽,這個地區共有n個城市和m條道路,每個城市都有賽艇比賽,在第i個 城市 賽艇表演的價錢為ai,去其他城市 也需要支付賽艇表演的 任意兩個城市之間通過 一條公路連線,並且道路是雙向通行的,賽艇比賽時經過的每一條道路都要支付一定的過路費,完比賽返回家時經過的每...

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...

51nod 迷宮問題

1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...