傳送門
題解:我是這麼做的,首先第一遍求出每個點向下的不相交的最長鏈和次長鏈,
這樣兩條鏈拼起來就是就是過這個點(不包含他的父親的情況下)的最長鏈。
在這些最長鏈中取max就可以得到直徑。
然後乙個點在直徑上,要麼他本身就在已經求出的最長鏈上(就是從這個點出發的最長+次長鏈=直徑長度),
要麼如果這個點在某一條直徑的某條鏈上(即這個點向父親方向延伸的最長+這個點向下的最長=直徑長度)
事實上還是要在已經求出的最長、次長和向父鏈上找兩條最長的拼起來看是不是直徑。
只不過最長肯定不會比次長短所以向父+次長就不用試了。
關於向父鏈的求法,假設x的某個兒子y,x的向父鏈為px,則
若y在x的最長鏈上,那麼py=max(px,x的次長鏈)+1
否則y不在x的最長鏈上,py=max(px,x的最長鏈)+1.
最後用ans記錄答案排個序即可。注意下標是從0~(n-1)不要寫錯。
//vijos 1476
#include#include#include#include#include#define maxn 200010
using namespace std;
vectorg[maxn];int ans[maxn],cnt;
int len1[maxn],len2[maxn],maxlen;
int firdfs(int rt,int fa)
return 0;
}int getdp(int rt,int fa,int flen)
}int main()
{ int n;scanf("%d",&n);
for(int i=1;i
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
hrb 1476 動態規劃
題意 n個單詞,每行字元數量m個,單行字元數量值為j時,花費我 m j 3 單詞間有乙個空格,問最小花費。最後一行不花費 解法dp i j 表示前i個單詞,長度為j的最小花費 最後一行多餘空格不作為計算,只有出現換行時才計算。dp i j 表示前i個單詞,長度為j的最小整齊度 由 dp i j 通過...
旅遊預算 動態規劃
2 問題描述 乙個旅行社需要估算乘汽車從某城市到另一城市的最小費用,沿路有若干加油站,每個加油站收費不一定相同。旅遊預算有如下規則 若油箱的油過半,不停車加油,除非油箱中的油不可支援到下一站 每次加油時都加滿 在乙個加油站加油時,司機要花費2元買東西吃 司機不必為其他意外情況而準備額外的油 汽車開出...