bzoj4033(樹上染色)

2022-05-18 09:58:09 字數 1310 閱讀 1201

樹上染色

有一棵點數為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 2

1 2 3

1 5 1

2 3 1

2 4 2

sample output

17

【樣例解釋】

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

一道河北省選題,樹形dp,寫**的時候注釋都寫上去了,f[i][j]表示以i為根,選了j個黑點的最大值。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

78 typedef long

long

ll;9

const ll inf=1e16+7;10

const

int nn=2007;11

12int

n,k;

13int

size[nn];

14int cnt=0,head[nn],next[nn*2],rea[nn*2],val[nn*2

];15

ll f[nn][nn];

1617

void add(int u,int v,int

fee)

1825

void dfs(int u,int

fa)2645}

46}47}

48void

init()

4958

for (int i=1;i<=n;i++)

59for (int j=1;j<=n;j++)

60 f[i][j]=-inf;

61 dfs(1,-1

);62 printf("

%lld\n

",f[1][k]);//

1為根節點。 63}

64int

main()

65

BZOJ 4033 樹上染色

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

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 來自 臥槽原來我...