BZOJ4033 HAOI2015 樹上染色

2022-08-05 01:21:15 字數 1234 閱讀 6129

有一棵點數為 n 的樹,樹邊有邊權。給你乙個在 0~ n 之內的正整數 k ,你要在這棵樹中選擇 k個點,將其染成黑色,並將其他 的n-k個點染成白色 。 將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間的距離的和的受益。問受益最大值是多少。

第一行包含兩個整數 n, k 。接下來 n-1 行每行三個正整數 fr, to, dis , 表示該樹中存在一條長度為 dis 的邊 (fr, to) 。輸入保證所有點之間是聯通的。

輸出乙個正整數,表示收益的最大值。

3 1

1 2 1

1 3 2

對於 100% 的資料,\(0 \leq k \leq n \leq 2000\)

考慮樹形dp,狀態應為第i個點的子樹內有j個黑色點對整棵樹的貢獻,問題就轉換為了樹形揹包,對於一條邊的貢獻=兩邊的黑色點數之積+兩邊的白色點之積,利用這一點進行樹形dp即可,每次枚舉子樹內黑色點個數,與當前子樹內黑色點個數,進行統計答案即可,將上界改為子樹大小,可以將時間複雜度優化至\(o(n^2)\).

#include #include #define mn 2005

#define r register

#define ll long long

#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);

#define end fclose(stdin);fclose(stdout)

inline int read()

int n,k,to[mn<<1],nt[mn<<1],v[mn<<1],h[mn],sz[mn],en;ll f[mn][mn];

inline void ins(int x,int y,int vl)

inline int min(int a,int b)

inline void dp(int u,int fa)

}int main()dp(1,0);printf("%lld\n",f[1][k]);

return 0;

}

bzoj4033 HAOI2015 樹上染色

題目鏈結 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。第一行兩個整數n,k。接下來n 1行每行三個正整數fr,to...

bzoj4033 HAOI2015 樹上染色

有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入保證所有點之間是聯通的。n 2000,0 k n 來自 臥槽原來我...

BZOJ4033 HAOI2015 樹上染色

bzoj4033 haoi2015 樹上染色 試題描述 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 將其他的n k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入 第一行兩...