P3177 [HAOI2015] 树上染色 题解
树形 dp,主要就是状态与转移方程。
设总共要染色
对于节点的第
接下来分别解释意思:
。 可以继承他们。下面计算 被计算次数。 。在 内染色 个节点, 外有 个节点被染色,边权 就会被计算 次(乘法原理)。 。 内会剩下 个节点未被染色, 外有 个节点,有 个未染色节点,边权 会被计算 次(同上)。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e3+10;
struct LovelyLzw//lzw 敲可爱
{
int v,ne,w;
}ee[N*2];
int hd[N],ne,s[N],V,n;
ll dp[N][N];
void ae(int u,int v,int w)//链式前向星
{
ee[++ne]={v,hd[u],w};
hd[u]=ne;
}
void dfs(int u)
{
s[u]=1;
for(int i=hd[u];i;i=ee[i].ne)
{
ll v=ee[i].v,w=ee[i].w;
if(s[v]) continue;dfs(v);
for(int j=s[u];j>=0;j--)//要倒序枚举 否则会被算多边
for(int k=min(s[v],V-j);k>=0;k--)
dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[v][k]+w*k*(V-k)+w*(s[v]-k)*(n-(V-k)-s[v]));//状态转移
s[u]+=s[v];//更新树大小
}
}
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>V;
for(int i=1,x,y,w;i<n;i++)cin>>x>>y>>w,ae(x,y,w),ae(y,x,w);
dfs(1);
cout<<dp[1][V];
return 0;
}
本文作者:cjrqwq
本文链接:https://www.cnblogs.com/yfzqwq/p/18492823
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步