有一棵點數為 n 的樹,樹邊有邊權。給你乙個在 0~ n 之內的正整數 k ,你要在這棵樹中選擇 k個點,將其染成黑色,並將其他 的n-k個點染成白色 。 將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間的距離的和的受益。問受益最大值是多少。
第一行包含兩個整數 n, k 。接下來 n-1 行每行三個正整數 fr, to, dis , 表示該樹中存在一條長度為 dis 的邊 (fr, to) 。輸入保證所有點之間是聯通的。
輸出乙個正整數,表示收益的最大值。
3 11 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個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入 第一行兩...