题目描述

有一棵点数为 N 的树,树边有边权。给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 。 将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的距离的和的受益。问受益最大值是多少。

输入格式

第一行包含两个整数 N, K 。接下来 N-1 行每行三个正整数 fr, to, dis , 表示该树中存在一条长度为 dis 的边 (fr, to) 。输入保证所有点之间是联通的。

输出格式

输出一个正整数,表示收益的最大值。

in:

3 1
1 2 1
1 3 2

out:

3

分析,这是一道树形dp思想的好题,通俗点讲,本题给你一颗加权树,有黑白两种点,求使得相同颜色的点之间的距离和的最大值。因此,我们选择用dp[now][x]来表示在now分支上选择x个黑点对答案的贡献是

多少,对于状态转移,我们可以看出对于最大值的子结构来书就是每一条分支上的权值*黑点和白点的总数

dp[now][x] = max(dp[now][x], dp[now][x-y] + dp[v][y] + var);

var则是在每一次dfs中新产生的贡献

                    long long var = 1ll * e[i].w * y * (k - y) + 1ll * e[i].w * (size[v] - y) * (n - k - size[v] + y);

有了转移方程,我们还需要特判掉一些特殊情况。比如说我们枚举在当前的子节点的子树中,我们枚举它里面有x个黑点,那么我们需要一个在其他子树中选了共 n - x个黑点的状态,但是如果其他的子树的大小总和还不到 n-x 的话,那么这个状态显然是不合法的,所以我们要去除这种情况。

#include<bits/stdc++.h>
#define re register int
typedef long long ll;
using namespace std;
int head[<<],cnt;
int n,k;
ll dp[<<][<<];
int size[<<];
struct node
{
int to;
int next;
int w;
} e[<<];
void add(int x,int y,int w)
{
e[++cnt].to=y;
e[cnt].w=w;
e[cnt].next=head[x];
head[x]=cnt;
}
void dfs(int now,int fa)
{
size[now]=;
dp[now][]=dp[now][]=;
for(re i=head[now]; i; i=e[i].next)
{
int v=e[i].to;
if(v==fa)
continue;//因为链式向前星加了双向边,防止死循环
else
dfs(v,now);
size[now]+=size[v];
for(re x=min(k,size[now]); x>=; x--)//还能提供的黑点数
for(re y=; y<=min(x,size[v]); y++)//因x限制所以取最小值
{
if(dp[now][x-y]==-)//特判
continue;
else
{
long long var = 1ll * e[i].w * y * (k - y) + 1ll * e[i].w * (size[v] - y) * (n - k - size[v] + y);
dp[now][x] = max(dp[now][x], dp[now][x-y] + dp[v][y] + var);
}
}
}
}
int main()
{
cin>>n>>k;
for(int i=; i<=n-; i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
memset(dp,-,sizeof(dp));
dfs(,);
cout<<dp[][k]<<endl;
return ;
}

洛谷P3177 [HAOI2015]树上染色(树形dp)的更多相关文章

  1. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  2. 洛谷 P3177 [HAOI2015]树上染色

    题目链接 题目描述 有一棵点数为 \(N\) 的树,树边有边权.给你一个在 \(0~ N\) 之内的正整数 \(K\) ,你要在这棵树中选择 \(K\)个点,将其染成黑色,并将其他 的\(N-K\)个 ...

  3. 洛谷P3177 [HAOI2015]树上染色(树上背包)

    题意 题目链接 Sol 比较套路吧,设\(f[i][j]\)表示以\(i\)为根的子树中选了\(j\)个黑点对答案的贡献 然后考虑每条边的贡献,边的两边的答案都是可以算出来的 转移的时候背包一下. # ...

  4. bzoj 4033: [HAOI2015]树上染色 [树形DP]

    4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...

  5. 【BZOJ4033】[HAOI2015]树上染色 树形DP

    [BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...

  6. [BZOJ4033][HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2437  Solved: 1034[Submit][Stat ...

  7. BZOJ4033或洛谷3177 [HAOI2015]树上染色

    BZOJ原题链接 洛谷原题链接 很明显的树形\(DP\). 因为记录每个点的贡献很难,所以我们可以统计每条边的贡献. 对于每一条边,设边一侧的黑点有\(B_x\)个,白点有\(W_x\),另一侧黑点有 ...

  8. bzoj4033 [HAOI2015]树上染色——树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP,状态中加入 x 与父亲之间的边的贡献: 边权竟然是long long... ...

  9. 洛谷 3177 [HAOI2015] 树上染色

    题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...

随机推荐

  1. DLC双端锁,CAS,ABA问题

    一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会出现多个对象 public cla ...

  2. 微服务统计,分析,图表,监控一体化的HttpReports项目在.Net Core 中的使用

    简单介绍 HttpReports 是 .Net Core 下的一个Web项目, 适用于WebAPI,Ocelot网关应用,MVC项目,非常适合针对微服务应用使用,通过中间件的形式集成到您的项目中,可以 ...

  3. 《图解机器学习-杉山将著》读书笔记---CH3

    CH3 最小二乘学习法 重点提炼 提出最小二乘学习法的缘故: 最小二乘学习法公式 对不同模型进行最小二乘法学习,得到最小二乘公式中的参数theta: 1.线性模型   代入3.1公式,对参数求偏导,偏 ...

  4. 【Python系统学习03】错误类型整理(一)

    错误类型与可能原因分析 A.语法错误: 1.syntaxError:invalid syntax 无效的语法 print(2019小石头) # print(2019小石头) # ^ # SyntaxE ...

  5. Win7计划任务命令

    计划任务命令 schtasks C:\Users\Administrator>schtasks /? SCHTASKS /parameter [arguments] 描述: 允许管理员创建.删除 ...

  6. C#实现DataTable转为Excel文件

    实现DataTable转为Excel文件,和上次分享的Excel文件转为DataTable互为反操作.DataTable转化为Excel文件是通过传入一个DataTable类型的参数,然后将传入的Da ...

  7. cogs 1176. [郑州101中学] 月考 Set 做法

    1176. [郑州101中学] 月考 ★★☆   输入文件:mtest.in   输出文件:mtest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在上次的月考中B ...

  8. JsonResponse和HttpResponse

    1.联系 JsonResponse继承HttpResponse 2.区别 JsonResponse 数据类型装自动换成json字符串并相应到前端,传到前端的是数据类型而非json字符串 HttpRes ...

  9. spring Cloud-eureka的保护模式

    eureka的首页出现以下警告 EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. REN ...

  10. Egret学习-初次创建项目

    最近无聊,好久没有写游戏了,决定学习下egret,主要原因:egret是h5框架,相比android和iPhone或cocos2dx来说不需要安装可以直接运行. 下面进入正题,开始学习egret 简单 ...