我是靠谱客的博主 安静鱼,这篇文章主要介绍BZOJ 4033: [HAOI2015]树上染色,现在分享给大家,希望可以做个参考。

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 2

1 2 3

1 5 1

2 3 1

2 4 2

Sample Output

17

【样例解释】

将点1,2染黑就能获得最大收益。

题解

复制代码
1
2
3
4
dp[x][j]表示以x为根的子树选了j个黑点的贡献 dp[x][j]=max(dp[x][j],dp[x][j-o]+dp[u][o]+val) 此时的val应该等于一边的黑色*另一边的黑色*距离+一边的白色*另一边的白色*距离

代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<bits/stdc++.h> #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 Edge{ int nxt,to,val; }edge[MAXN*2]; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } inline void add(int bg,int ed,int w){ edge[++cnt].to=ed; edge[cnt].val=w; edge[cnt].nxt=head[bg]; head[bg]=cnt; } inline void dfs(int x,int fa){ siz[x]=1; for(int i=1;i<=k;i++) dp[x][i]=-1;dp[x][0]=dp[x][1]=0; for(register int i=head[x];i;i=edge[i].nxt){ int u=edge[i].to; if(u==fa) continue; dfs(u,x); siz[x]+=siz[u]; } for(register int i=head[x];i;i=edge[i].nxt){ int u=edge[i].to; if(u==fa) continue; int minn=min(k,siz[x]); for(register int j=minn;j>=0;j--){int mi=min(j,siz[u]); for(register int s=0;s<=mi;s++)if(~dp[x][j-s]){ LL v=(LL)s*(k-s)*edge[i].val+(LL)(siz[u]-s)*(n-k+s-siz[u])*edge[i].val; dp[x][j]=max(dp[x][j],dp[x][j-s]+dp[u][s]+v); } } } } int main(){ n=read();k=read(); for(int i=1;i<n;i++){ int x,y,z; x=read();y=read();z=read(); add(x,y,z);add(y,x,z); } dfs(1,0); printf("%lld",dp[1][k]); return 0; }

最后

以上就是安静鱼最近收集整理的关于BZOJ 4033: [HAOI2015]树上染色的全部内容,更多相关BZOJ内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部