Codeforces 1240C. Paint the Tree
首先每个点 $u$ 只能选择不超过 $k$ 个相连的边
并且设边为 $(u,v)$ ,那么此时 $v$ 也必须选择这条边
因为图是一颗树,显然考虑一下树形 $dp$
设 $f[x][0/1]$ 表示考虑完 $x$ 的子树,当前节点有没有留一个选择给和父亲相连的边($0$ 表示没有)
那么对于 $f[x][0]$
考虑所有 $x$ 的儿子 $v$,我们要选出不超过 $k$ 个儿子的 $f[v][1]+val(x,v)$ ,然后剩下的儿子全部选 $f[v][0]$ ,求最大价值
(其中 $val(x,v)$ 是边 $(x,v)$ 的价值)
考虑一开始所有的儿子都先选 $f[v][0]$,对于某个儿子 $v$ 如果我们之后要选 $f[v][1]$ ,那么增加的贡献 $delta$ 为 $-f[v][0]+f[v][1]+val(x,v)$
显然 $-f[v][0]$ 是因为之前已经加入了 $f[v][0]$ 的贡献
那么此时每个儿子的选择互不影响,直接按 $delta$ 排序取前 $k$ 大即可(注意如果还没到 $k$ 个但是 $delta$ 已经小于 $0$ 了就不用选)
对于 $f[x][1]$ 也是一样的道理,但是我们这时候取的就是前 $k-1$ 的的 $delta$ 了
不妨设 $1$ 为根,那么答案即为 $f[1][0]$
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=5e5+;
int Q,n,K;
int fir[N],from[N<<],to[N<<],val[N<<],cntt;
inline void add(int a,int b,int c) { from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; val[cntt]=c; }
ll f[N][];
void dfs(int x,int fa)
{
vector <ll> tmp;
for(int i=fir[x];i;i=from[i])
{
int v=to[i]; if(v==fa) continue;
dfs(v,x);
f[x][]+=f[v][]; f[x][]+=f[v][];
tmp.push_back(f[v][]-f[v][]+val[i]);
}
sort(tmp.begin(),tmp.end()); reverse(tmp.begin(),tmp.end());
int sz=tmp.size();
for(int i=;i<K&&i<sz;i++)
{
if(tmp[i]<=) break;
f[x][]+=tmp[i];
if(i<K-) f[x][]+=tmp[i];
}
}
int main()
{
Q=read();
while(Q--)
{
n=read(),K=read(); int a,b,c;
for(int i=;i<=n;i++) f[i][]=f[i][]=;
for(int i=;i<=n;i++) fir[i]=; cntt=;
for(int i=;i<n;i++)
{
a=read(),b=read(),c=read();
add(a,b,c); add(b,a,c);
}
dfs(,);
printf("%lld\n",f[][]);
}
return ;
}
Codeforces 1240C. Paint the Tree的更多相关文章
- Codeforces 1244D. Paint the Tree
传送门 首先如果某个点的度数大于 $2$ 那么显然无解 然后考虑点的度数小于等于 $2$ 的情况 发现其实是一条链 一旦确定了链开头的两个点,后面的点的颜色都可以通过之前的点推出 所以直接枚举即可 # ...
- Codeforces 461B Appleman and Tree(木dp)
题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...
- Paint the Tree
Paint the Tree 题目来源: Moscow Pre-Finals Workshop 2018 Day 5 C 题目大意: 一棵\(n(n\le2000)\)个点的树,有\(m(2<m ...
- Codeforces 1129 E.Legendary Tree
Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1\) 次 \((S=\{1\},T=\{ ...
- Codeforces 280C Game on tree【概率DP】
Codeforces 280C Game on tree LINK 题目大意:给你一棵树,1号节点是根,每次等概率选择没有被染黑的一个节点染黑其所有子树中的节点,问染黑所有节点的期望次数 #inclu ...
- Codeforces A. Game on Tree(期望dfs)
题目描述: Game on Tree time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- E. Paint the Tree 树形dp
E. Paint the Tree 题目大意:给你一棵树,每一个点都可以染k种颜色,你拥有无数种颜色,每一种颜色最多使用2次,如果一条边的两个节点拥有同一种颜色,那么就说 这条边是饱和的,一个树的价值 ...
- Codeforces Round #781(C. Tree Infection)
Codeforces Round #781 C. Tree Infection time limit per test 1 second memory limit per test 256 megab ...
- Codeforces 196C Paint Tree(贪心+极角排序)
题目链接 Paint Tree 给你一棵n个点的树和n个直角坐标系上的点,现在要把树上的n个点映射到直角坐标系的n个点中,要求是除了在顶点处不能有线段的相交. 我们先选一个在直角坐标系中的最左下角的点 ...
随机推荐
- 两个int值相乘超过int最大值
System.out.println(100000000*1000 ); //输出结果是:1215752192 先将100000000*1000 的结果转化为二进制: 10111 01001000 0 ...
- 17.树的子结构 Java
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路 双递归:外层HasSubtree是一个先根遍历递归,内层isDirectSubTree是一个 ...
- 解决Powershell中不能运行脚本问题
问题: powershell中不能执行脚本,提示‘because running scripts is disabled on this system’ 原因: powershell中默认的execu ...
- requests和BeautifulSoup模块的使用
用python写爬虫时,有两个很好用第三方模块requests库和beautifulsoup库,简单学习了下模块用法: 1,requests模块 Python标准库中提供了:urllib.urllib ...
- shift and add算法相关
1.超分辨率 非均匀插值 Farsiu S, Robinson D, Milanfar P. Robust shift and add approach to superresolution[J]. ...
- TCP怎么保证证包有序传输的,TCP的慢启动,拥塞避免,快速重传,快速恢复
TCP提供了最可靠的数据传输,它给发送的每个数据包做顺序化(这看起来非常烦琐),然而,如果TCP没有这样烦琐的操作,那么,可能会造成更多的麻烦.如造成数据包的重传.顺序的颠倒甚至造成数据包的丢失. 那 ...
- 让 Nginx 支持 WAF 防护功能实战
ngx_lua_waf 安装说明文档 作者github地址: https://github.com/loveshell/ngx_lua_waf ———————————————————————————— ...
- 【转载】网页JS获取当前地理位置(省市区)
眼看2014又要过去了,翻翻今年的文章好像没有写几篇,忙真的或许已经不能成为借口了,在忙时间还是有的,就像海绵里的水挤挤总会有滴.真真的原因是没有学习过什么新的技术,工作过程中遇到的问题也不是非常难并 ...
- CentOS7或CentOS8 安装VirtualBox Guest Addon缺少kernel-headers的解决办法
CentOS7或CentOS8 在Oracle VM VirtualBox中安装Guest Addon时,如果缺少kernel-headers和相应的编译库,会提示出错. "kernel h ...
- Jenkins - Tips
01 - RPM包安装方式 默认路径 配置文件:/etc/sysconfig/jenkins 日志文件:/var/log/jenkins/jenkins.log 执行文件:/usr/lib/jenki ...