ac通道
馬奧雷利亞諾布恩迪亞上校發動了他的第三十二次戰爭,讓我們祝他好運。
馬孔多附近有n個城市, 有n-1條雙向道路連通這些城市。上校想通過摧毀兩條公路的方式對當局予以威懾。但是上校的老師 告訴他為了戰略目的這兩條路不可以有共同的城市。這次行動對當局的威懾效果將等於兩條路徑的長 度的乘積。假設每條道路的長度等於1,並且路徑的長度等於道路的數量。請你幫上校造成最大的威 懾。
單組測試資料。第一行是乙個整數 n (2≤n≤200) ,n是這個馬孔多附近城市的數量。接下來n-1行是 道路的資訊,每一行是兩個整數ai,bi,它們是城市的編號,表示ai和bi之間有一條道路直接連通。 (1≤ai,bi≤n)。
輸出最大的威懾
輸入 #1複製
41 22 3
3 4
輸出 #1複製
1
輸入 #2複製
22 1
輸出 #2複製
0
輸入 #3複製
61 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利器:
#includeusingnamespace
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 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...