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