P3177 [HAOI2015] 树上染色
P3177 [HAOI2015] 树上染色
[P3177 HAOI2015] 树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目大意
有一棵
求最大收益。
思路
树上背包
这种题肯定找边的贡献
设
一条连接
显然:
实现时要倒序枚举
code
#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
#define LL long long
using namespace std;
const int N = 2005;
int n , hd[N] , cnt , fa[N] , sz[N] , K;
LL f[N][N];
struct E {
int to , nt;
LL w;
} e[N << 1];
void add (int x , int y , LL z) { e[++cnt].to = y , e[cnt].nt = hd[x] , hd[x] = cnt , e[cnt].w = z; }
void dfs (int x) {
int y;
sz[x] = 1;
f[x][0] = f[x][1] = 0;
for (int i = hd[x] ; i ; i = e[i].nt) {
y = e[i].to;
if (y == fa[x]) continue;
fa[y] = x;
dfs (y);
sz[x] += sz[y];
fd (j , min (K , sz[x]) , 0) {
if (f[x][j] != -1)
f[x][j] += f[y][0] + (n - K - sz[y]) * sz[y] * e[i].w;
fu (k , max(1 , j + sz[y] - sz[x]) , min (j , sz[y])) {
if (f[x][j - k] == -1) continue;
f[x][j] = max (f[x][j] , f[x][j - k] + f[y][k] + e[i].w * (K - k) * k + e[i].w * (n - K - sz[y] + k) * (sz[y] - k));
}
}
}
}
int main () {
int u , v;
LL w;
scanf ("%d%d" , &n , &K);
fu (i , 1 , n - 1) {
scanf ("%d%d%lld" , &u , &v , &w);
add (u , v , w) , add (v , u , w);
}
memset (f , -1 , sizeof (f));
dfs (1);
printf ("%lld" , f[1][K]);
return 0;
}
如果人生会有很长,愿有你的荣耀永不散场
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端