bzoj4987 Tree 樹形揹包

2021-08-17 07:28:21 字數 1267 閱讀 4107

description:

從前有棵樹。 找出k

k

個點a1

,a2,

…,ak

' role="presentation" style="position: relative;">a1,

a2,…

,aka

1,a2

,…,a

k。 使得∑

dis(

ai,a

i+1)

,(1<=

i<=k−

1)∑ di

s(ai

,ai+

1),(

1<=

i<=k−

1)

最小solution:

有乙個結論是這些點必然是乙個連通塊。

這樣我們可以dp

d

p。設dp

[i][

j][0

/1/2

] dp[

i][j

][0/

1/2]

表示根為

i i

的子樹,選了

j' role="presentation" style="position: relative;">j

j個點,兩個端點都在i/

i

/乙個在

i i

另乙個在連通塊葉子結點/兩個都在葉子結點。

然後轉移即可。

#include 

using

namespace

std;

const

int n = 3005;

struct edge e[n << 1];

int n, cnt = 1, k;

int h[n], dp[n][n][3], sz[n];

void link(int u, int v, int w)

void dfs(int u, int last) }}

}sz[u] += sz[v];}}

}int main()

memset(dp, 0x3f3f, sizeof(dp));

dfs(1, 0);

int ans = 1e9;

for(int i = 1; i <= n; ++i)

printf("%d\n", ans);

return

0;}

bzoj 3754 Tree之最小方差樹

題目大意 給你乙個無相連通圖,要你找出乙個生成樹,使得他們的邊權的方差最小。n 100,m 2000,c 邊權 100 我們考慮最小生出樹常用的kruskal演算法,它需要得到乙個邊的排列,然後在進行貪心的加邊。我們可以考慮暴力每個排列,然後進行kruskal。這樣時間複雜度為o m m 我們發現複...

BZOJ2654 tree 生成樹 二分

題目鏈結 給你乙個無向帶權連通圖,每條邊是黑色或白色,求一棵最小權的恰好有 need 條白色邊的生成樹。題目保證有解,輸出最小權值。其中每條邊權在 1,100 範圍內。首先有乙個比較明顯的想法 用kruskal跑出乙個最小生成樹,然後再不斷往其中加邊調整白色邊的數量,用lct維護圈內最大異色邊。好吧...

Tree字典樹講解

就像樹根一樣,每個點就是節點,也像乙個網狀鍊錶。優點 對於字串可以減少無所謂的比較,效率很高。多說無益,上例題 ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現 現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 input 輸入資料的第...