BZOJ 4033 HAOI2015 樹上染色

2022-05-12 11:52:44 字數 1363 閱讀 7490

time limit: 10 sec memory limit: 256 mb

submit: 2569 solved: 1088

[submit][status][discuss]

description

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

【樣例解釋】

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

dp[x][j]表示以x為根的子樹選了j個黑點的貢獻

dp[x][j]=max(dp[x][j],dp[x][j-o]+dp[u][o]+val)

此時的val應該等於一邊的黑色*另一邊的黑色*距離+一邊的白色*另一邊的白色*距離

#include

#define ll long long

using

namespace

std;

const

int maxn = 2005;

int k,n,head[maxn],cnt,siz[maxn];

ll dp[maxn][maxn]; //dp[i][j]表示前i個點,染了j個黑色

struct edgeedge[maxn*2];

int read()

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

return x*f;

}inline

void add(int bg,int ed,int w)

inline

void dfs(int x,int fa)

for(register

int i=head[x];i;i=edge[i].nxt)}}

}int main()

dfs(1,0);

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