HYSBZ 4033 樹上染色

2021-09-25 14:14:56 字數 965 閱讀 7514

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

input

第一行兩個整數n,k。

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

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

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

output

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

sample input

5 21 2 3

1 5 1

2 3 1

2 4 2

sample output

17【樣例解釋】

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

思路:我們知道有道題,是求兩兩距離之和,我們可以一遍dfs得到,即每條邊的貢獻=sz[v]*(n-sz[v])*len[i];此題也一樣,我們用dp[u][x]表示以u為根的子樹裡有x個黑點的最大收益。 不難得到dp方程。

#includeusing namespace std;

#define maxn 2010

typedef long long ll;

struct edgeedge[maxn<<1];

int n,k,tot=0,siz[maxn],son[maxn],head[maxn];

ll dp[maxn][maxn];

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

void dfs(int u,int pre)

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

int main()

dfs(1,0);

printf("%lld\n",dp[1][k]);

return 0;

}

BZOJ 4033 樹上染色

bzoj 4033 傳送門 此題用到了計算貢獻的方法,將 多條路徑的路徑和 sum w i cnt i 這樣我們由找出所有路徑再計算轉化成了對每條邊計算其的貢獻 由於所有節點只用2種選擇,接下來就是比較套路的樹形dp了 設 dp i j 為在以 i 為根的子樹中,有 j 個黑點時的 max 這樣按照...

bzoj4033(樹上染色)

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

bzoj4033 HAOI2015 樹上染色

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