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. 数据结构和算法(Golang实现)(21)排序算法-插入排序

    插入排序 插入排序,一般我们指的是简单插入排序,也可以叫直接插入排序.就是说,每次把一个数插到已经排好序的数列里面形成新的排好序的数列,以此反复. 插入排序属于插入类排序算法. 除了我以外,有些人打扑 ...

  2. AJ整理问题之:copy,对象自定义copy 什么是property

    AJ分享,必须精品 copy copy的正目的 copy 目的:建立一个副本,彼此修改,各不干扰 Copy(不可变)和MutableCopy(可变)针对Foundation框架的数据类型. 对于自定义 ...

  3. Redis学习二:Redis高并发之主从模式

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 前面已经学习了Redis的持久化方式,接下来开始学习Redi ...

  4. uni-app同步缓存值 设置 读取 删除

    A页面 <view class="go-to-tab" @tap="gotologin"> 去login页面 </view> msg : ...

  5. 基于 Njmon + InfluxDB + Grafana 实现性能指标实时可视监控

    引言 最近逛 nmon 官网时,发现了一个新工具 njmon,功能与 nmon 类似,但输出为 JSON 格式,可以用于服务器性能统计. 可以使用 njmon 来向 InfluxDB 存储服务器性能统 ...

  6. jquery的焦点图片无限循环关键思维

    在循环的时候,关键的是按(下一页按钮)到最后一页的时候和按(上一页按钮)到到第一页的时候如何转换: 首先必须知道3个js方法,prepend().append()和clone(); prepend() ...

  7. jdbctemplate打印sql

    在logback.xml里加入如下配置即可: <include resource="org/springframework/boot/logging/logback/base.xml& ...

  8. Hugo博客搭建

    HUGO + Github + Github Action持续集成部署个人博客 HUGO本地环境 首先在HUGO的官网下载Hugo的Windows安装包,然后将路径添加到环境变量即可. step1:下 ...

  9. 牛顿迭代法的理解与应用( x 的平方根)

    题目来源与LeetCode算法题中的第69题,具体内容如下(点击查看原题): 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只 ...

  10. Linux网络编程(1)

    Preview 课程要求,所以学了一下UNIX网络编程,老师说挺简单的,实际上手之后才发现这里面关系没那么简单.从CS:APP11章网络编程,再加上不停地man,对当前的学习做个总结,也顺带当个报告了 ...