E. Paint the Tree

题目大意:给你一棵树,每一个点都可以染k种颜色,你拥有无数种颜色,每一种颜色最多使用2次,如果一条边的两个节点拥有同一种颜色,那么就说

这条边是饱和的,一个树的价值定义为饱和边的权值之和,问一棵树的最大价值是多少。

dp[u][1] 表示这条边用了k种颜色了。

dp[u][0] 表示这条边用了k-1种颜色。

子节点往父亲节点转移的时候,这个转移带有一点点的贪心。

首先因为每一个子节点到父亲节点的这条边要不要都会对后面产生影响。

所以我们可以构造一个模型,dp模型

如果有n个物品,每一个物品有两种选择,A和B,有一个限制就是如果选A,那么选A的数量不能超过k个,然后问选完之后的最大价值,A的价值为a, B的价值为b。

这个就可以用dp来考虑,dp[i][j] 表示前面 i 个选了j个A的最大价值。

当然也可以不dp,可以贪心的考虑,因为所有的B都是可以选择的,所以我们先考虑,选择所有的B,然后考虑,如果要换成A可以增加的差值。

sort排序找前面k大且大于0的差值。

这个题目也是一样的,我们就先选了所有的dp[v][1] 然后如果选这条边,那么差值就是dp[v][0]+w-dp[v][1]

找前面k大且大于0的数之和。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <bitset>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=5e5+;
typedef long long ll;
ll dp[maxn][];
int n,k,head[maxn],cnt;
struct node{
int v,w,nxt;
node(int v=,int w=,int nxt=):v(v),w(w),nxt(nxt){}
}ex[maxn*]; void add(int u,int v,int w){
ex[cnt]=node(v,w,head[u]);
head[u]=cnt++;
ex[cnt]=node(u,w,head[v]);
head[v]=cnt++;
}
bool cmp(int a,int b){
return a>b;
} void dfs(int u,int pre){
dp[u][]=dp[u][]=;
for(int i=head[u];i!=-;i=ex[i].nxt){
int v=ex[i].v;
if(v==pre) continue;
dfs(v,u);
dp[u][]+=dp[v][];
dp[u][]+=dp[v][];
}
vector<int>val;val.clear();
for(int i=head[u];i!=-;i=ex[i].nxt){
int v=ex[i].v;
if(v==pre) continue;
val.push_back(dp[v][]+ex[i].w-dp[v][]);
}
sort(val.begin(),val.end(),cmp);
int len=val.size();
len=min(k,len);
for(int i=;i<len;i++){
if(val[i]<) break;
if(i<k-) dp[u][]+=val[i];
dp[u][]+=val[i];
}
} int main(){
int t;
scanf("%d",&t);
while(t--){
cnt=;
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) head[i]=-;
for(int i=;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dfs(,-);
printf("%lld\n",max(dp[][],dp[][]));
}
return ;
}

E. Paint the Tree 树形dp的更多相关文章

  1. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  2. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  3. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  4. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  5. hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

    /** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...

  6. 5.10 省选模拟赛 tree 树形dp 逆元

    LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...

  7. Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】

    题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...

  8. codeforces Round #263(div2) D. Appleman and Tree 树形dp

    题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...

  9. POJ 2486 Apple Tree(树形DP)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

随机推荐

  1. 文件上传——客户端检测绕过(JavaScript检测)(一)

    前言 通常再一个web程序中,一般会存在登陆注册功能,登陆后一般会有上传头像等功能,如果上传验证不严格就可能造成攻击者直接上传木马,进而控制整个web业务控制权.下面通过实例,如果程序只进行了客户端J ...

  2. Spring Cloud 系列之 Gateway 服务网关(一)

    什么是 Spring Cloud Gateway Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由 ...

  3. Python-气象-大气科学-可视化绘图系列(一)——利用xarray读取netCDF文件并画图(代码+示例)

    本文原创链接:https:////www.cnblogs.com/zhanling/p/12192978.html 1 import numpy as np import xarray as xr i ...

  4. [linux][mysql] 命令更改表结构:添加、删除、修改字段、调整字段顺序

    原文出处:http://www.phpernote.com/MySQL/1120.html 查看表结构: desc tabl_name; show columns fromtable_name: 常用 ...

  5. Java 导出Excel xlsx、xls, CSV文件

    通用导出功能: 1.支持Excel xlsx.xls 2.支持CSV文件导出 3.数据库查询分页导出.内存导出 4.支持大批量数据导出 使用步骤如下 导入jar <dependency> ...

  6. iview使用之怎样通过render函数在tabs组件中添加标签

    在实际项目开发中我们通常会遇到一些比较'新颖'的需求,而这时iview库里往往没有现成可用的组件示例,所以我们就需要自己动手翻阅IviewAPI进行自定义一些组件,也可以说是将iview库里的多种组件 ...

  7. 在.NET Core中用最原生的方式读取Nacos的配置

    背景 之前老黄写过一篇<ASP.NET Core结合Nacos来完成配置管理和服务发现>简单介绍了如何让.NET Core程序接入Nacos,之前的SDK里面更多的是对Nacos的Open ...

  8. Vue自定义指令 数据传递

    在项目开发过程中,难免会遇到各种功能需要使用Vue自定义指令--directive 去实现 .关于directive的使用方式这里就不做过多的介绍了,Vue官方文档中说的还是听明白的.今天讲讲在使用V ...

  9. pytorch GPU训练好的模型使用CPU加载

    torch.load('tensors.pt') # 把所有的张量加载到CPU中 torch.load('tensors.pt', map_location=lambda storage, loc: ...

  10. 查看现有的 cipher suite

    openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist]