题意:

有一颗树,n个点,边有边权。

有无限多种颜色,每个点可以同时染上k种颜色,如果一条边的两个端点 拥有至少一种相同的颜色,那么说这条边是“饱和的”。

问:所有“饱和边”的权值和最大为多少,只需要输出最大值,不需要输出方案。

思路:

一开始看到这题的tag是2200,感觉肯定不会,后来发现有的人过了这题,但是却过不了D题,我就试着做做看了。结果还行。

显然,简化题意后,就是说:

删除一些边,使得每个点的度最多为k,求剩下的边的最大权值和。

这种题,暴力不可取,也没有什么模板的算法可以用,所以第一感觉就是DP。

树上的DP,一般思路就是从叶子节点回溯回去,先算子树,再转移到更大的树。

而我们发现,这题的关键点就在于 子树的根与父节点相连 的那条边上,因为这条边取或者不取,对子树和父节点有很大影响。

开始猜想,试着给dp[][]赋予含义,

先不看i节点与父节点相连的那条边,dp[i][0]表示节点i取满k条边的最大权值和,dp[i][1]表示节点i取k-1条边的最大权值和,这就是给我们忽视的那条边留个位置。

再看父节点的计算,如果我们取的这条边 可以使这棵子树的权值和变大,那么我们就取,但是最多只能取k条,所以优先取前k条增幅最大的。

其他细节就不说了,因为我不太会说

(思路写这么多,这么繁琐,说明这不是一篇好的题解,但是我想记录我的心路历程)

代码:

#include <stdio.h>
#include <queue>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <set>
#include <iostream>
using namespace std;
typedef long long int ll;
const int maxn = 1e6 + ;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9 + ;
const ll seed = ;
struct node{
int u,v,next;
ll val;
}edge[maxn];
struct node2{
ll val;
int id;
bool friend operator <(node2 x,node2 y){
return x.val < y.val;
}
}a[maxn];
ll dp[maxn][];
int cnt,head[maxn],k;
void add(int u,int v,int val)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].val = val;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void dfs(int u,int pre)
{
int v,num = ,flag = ;
ll temp = ,_temp = ;
for(int i = head[u];i != -;i = edge[i].next){
v = edge[i].v;
if(v != pre){
flag = ;
dfs(v,u);
}
}
for(int i = head[u];i != -;i = edge[i].next){
v = edge[i].v;
if(v != pre){
if(dp[v][] + edge[i].val - dp[v][] > ){
a[++num].val = dp[v][] + edge[i].val - dp[v][];
a[num].id = v;
}
else
_temp += dp[v][];
}
}
if(flag == ){
dp[u][] = dp[u][] = ;
return ;
}
sort(a + ,a + num + );
for(int i = num;i >= max(num - k + ,);i--){
temp += dp[a[i].id][] + a[i].val;
} dp[u][] = dp[u][] = temp + _temp;
if(k <= num)
dp[u][] -= a[num - k + ].val;
for(int i = ;i <= num - k;i++){
dp[u][] += dp[a[i].id][];
dp[u][] += dp[a[i].id][];
}
return ;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
for(int i = ;i <= n;i++)
head[i] = -;
cnt = ; int u,v;
ll val;
for(int i = ;i < n;i++){
scanf("%d%d%lld",&u,&v,&val);
add(u,v,val);
add(v,u,val);
}
dfs(,);
printf("%lld\n",dp[][]);
}
return ;
}

cf 1241 E. Paint the Tree(DP)的更多相关文章

  1. cf-Round551-Div2-D. Serval and Rooted Tree(DP)

    题目链接:https://codeforces.com/contest/1153/problem/D 题意:有一棵树,给定结点数n,在每个结点上的操作(max:表示该结点的number为其孩子结点中的 ...

  2. 【Codeforces】CF 467 C George and Job(dp)

    题目 传送门:QWQ 分析 dp基础题. $ dp[i][j] $表示前i个数分成j组的最大和. 转移显然. 吐槽:做cf题全靠洛谷翻译苟活. 代码 #include <bits/stdc++. ...

  3. [CSP-S模拟测试]:tree(DP)

    题目传送门(内部题57) 输入格式 第一行包含一个数:$n$表示树的节点数.接下来$n-1$行,每行包含两个数:$u,v$表示无根树的一条边. 输出格式 输出$n$行,第$i$行包含一个浮点数,保留三 ...

  4. 【Codeforces】CF 9 D How many trees?(dp)

    题目 传送门:QWQ 分析 用$ dp[i][j] $表示用i个节点,有多少深度小于等于j的二叉树. 答案是$ dp[n][n] - dp[n][h-1] $ 转移时枚举左子树的节点数量,就可以知道右 ...

  5. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  6. Device Tree(三):代码分析【转】

    转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...

  7. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  8. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  9. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

随机推荐

  1. java 寒假作业

    寒假作业 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ (如果显示不出来,可以参见[图1.jpg]) 每个方 ...

  2. 【转置】使用mysql转置表格行和列

    1.原始表 2.查询结果表 3.查询语句 1 SELECT 2 year1, 3 SUM( CASE WHEN mon= 1 THEN account END ) AS m1, 4 SUM( CASE ...

  3. oracle根据一张表更新另外一张表

    知道是两张表进行更新,之前作过mysql的,直接就写了: update a,b set a.code = b.code wehre a.id = b.id 然后就报错了,上网查了下知道oracle不能 ...

  4. emmmmmmmmmmmmmmmmmm01

    当体会活着有多么难之后,就不要在那么随意的活着,今天有多么不在意自己的人生,明天就要加倍的被别的人左右自己的人生. 多思考,多学习,多总结,多创造.让自己成为有用的人,让自己未来有一天成为自己的主人.

  5. jenkins#安装docker

    环境:centos7 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 添加Docker软件包源 yum-config ...

  6. Saul's Blog

    2019Falg完成情况 - 脱贫脱单不脱发(已完成) - 买辆帕拉梅拉 (已完成) - 不再是个蒟蒻(已完成) - 来一场说走就走的旅行(已完成) - 停止口嗨(未完成) ᑋᵉᑊᑊᵒ ᵕ̈ ₂₀₂₀ ...

  7. hadoop 配置问题以及HDFS下如何读写文件

    辛辛苦苦学两年 ,一举回到解放前!!! 大数据开始学真的头疼 关键是linux你玩的不6 唉难受 hadoop 配置参见博客 http://dblab.xmu.edu.cn/blog/install- ...

  8. vi/vim常用操作

    什么是vim? Vim是从 vi 发展出来的一个文本编辑器.代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器. vim的 ...

  9. UVALive - 7752 Free Figurines

    题意:有n个娃娃,如果大娃娃j直接套小娃娃i,则fa[i] = j.若fa[i] = 0,则该娃娃自由.给出每个娃娃初始的父亲,和改变后的父亲,在满足以下合法操作的条件下,问最少需要多少次变换. 1. ...

  10. NRF51822和NRF52832的主要区别

    对于NRF51822和NRF52832的选择性相信大家也是非常困惑的,哪个性价比高?下面为大家讲下NRF51822和NRF52832的一个区别,让大家能够更好的快速选型加快研发产品进度!   主要分为 ...