bzoj4033 HAOI2015 樹上染色

2021-07-29 02:57:53 字數 2215 閱讀 6983

題目鏈結

有一棵點數為n的樹,樹邊有邊權。給你乙個在0~n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並

將其他的n-k個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。

問收益最大值是多少。

第一行兩個整數n,k。

接下來n-1行每行三個正整數fr,to,dis,表示該樹中存在一條長度為dis的邊(fr,to)。

輸入保證所有點之間是聯通的。

n<=2000,0<=k<=n

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

5 21 2 3

1 5 1

2 3 1

2 4 2

【樣例解釋】

將點1,2染黑就能獲得最大收益。

樹形dp。

首先不難想到設fi

,j為以編號為i的節點為根的子樹中有j個黑色節點對答案的貢獻。

這裡發現不好轉移,所以把該子樹內的點與子樹外的點組合所產生的權值也計算進去。考慮統計所有邊權對答案的貢獻,一條邊對答案產生的貢獻為邊權

∗(子樹

內黑色點

數量∗子

樹外黑色

點數量+

子樹內白

色點數量

∗子樹外

白色點數

量)。

用dfs來求,列舉 i 的每個兒子 j,現在的 f[

i]是包含了[1

,j−1

] 子樹,然後兩重迴圈列舉範圍是 [1

,j−1

] 的子樹總 size 和 j 的 size,來更新 f[

i],這樣更新之後的 f[

i]就是 [1

,j] 子樹的答案了。

通過奧妙重重的方法可以發現每個點對(u

,v) 只會在其lc

a 處被考慮到,所以複雜度是o(

n)。

//這一版圖方便結果跑得奇慢無比,雖然是過了。

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline

int read()

while(c >= '0' && c <='9')

return x * f;

}const

int n = 2000 + 10, inf = 0x3f3f3f3f;

int to[n<<1], val[n<<1], hd[n], nxt[n<<1], tot;

int siz[n];

int n, k;

ll f[n][n];

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

void init()

}void dfs(int u, int fa)

}void work()

//把每條邊的權值放到子樹裡處理,時間表現一下子正常了許多。

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline

int read()

while(c >= '0' && c <='9')

return x * f;

}const

int n = 2000 + 10, inf = 0x3f3f3f3f;

int to[n<<1], val[n<<1], hd[n], nxt[n<<1], tot;

int siz[n];

int n, k;

ll f[n][n], tmp[n];

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

void init()

}void dfs(int u, int fa, int pre)

for(int i = 0; i <= min(siz[u], k); i++)

f[u][i] += (ll)pre * ((ll)i*(k-i) + (ll)(siz[u]-i)*(n-k-(siz[u]-i)));

}void work()

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個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。輸入 第一行兩...

BZOJ 4033 HAOI2015 樹上染色

time limit 10 sec memory limit 256 mb submit 2569 solved 1088 submit status discuss description 有一棵點數為n的樹,樹邊有邊權。給你乙個在0 n之內的正整數k,你要在這棵樹中選擇k個點,將其染成黑色,並 ...