HAOI2015 樹上染色(樹形dp,樹形揹包)

2021-09-27 08:18:27 字數 1300 閱讀 7646

題目描述

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

將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。

輸入描述:

第一行兩個整數n,k。

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

輸入保證所有點之間是聯通的。n ≤ 2000,0 ≤ k ≤ n

輸出描述:

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

示例1輸入

複製5 2

1 2 3

1 5 1

2 3 1

2 4 2

輸出複製

17說明

【樣例解釋】

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

這種題目一看就是列舉每條邊的貢獻。通過這道題目接觸了樹形揹包。。

dp[i][j]表示著以i為根的子樹中有j個點染成黑色的最大價值。

子樹中的每個點都有兩種狀態,染色或者是不染色。所以類似於01揹包。

**如下:

#include

#define ll long long

#define inf 0x7f7f7f7f

using

namespace std;

const

int maxx=

2e3+

100;

struct edgee[maxx<<1]

;int head[maxx<<1]

,tot,size[maxx]

;ll dp[maxx]

[maxx]

;int n,k;

/*-------------事前準備-------------*/

inline

void

init()

inline

void

add(

int u,

int v,ll w)

/*------------樹形dp-------------*/

inline

void

dfs(

int u,

int f)}}

}int

main()

dfs(1,

0);printf

("%lld\n"

,dp[1]

[k]);}

return0;

}

努力加油a啊,(o)/~

HAOI2015 樹上染色(樹形dp)

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

HAOI2015 樹上染色

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

HAOI2015 樹上染色

考慮子樹當中所有邊的貢獻即可。然後就能簡單做樹上揹包了。但是要注意列舉的順序,應該從大到小更新,否則某個狀態會多次被加。如果不想考慮列舉順序,那麼直接dp的時候用乙個臨時陣列記錄。ac pragma gcc optimize ofast funroll all loops include defin...