题解:P3177 [HAOI2015] 树上染色

news/2024/11/18 7:27:21/文章来源:https://www.cnblogs.com/anins/p/18551533

[HAOI2015] 树上染色

思路:

先考虑怎么计算答案,后动态规划。

数学部分:

我们发现此题让我们计算最大收益,那我们考虑一种染色方案的收益是怎么算出来的:

显然总收益为所有边贡献之和,一条边对收益的贡献显然是经过它的次数与它的权值之积,那么总收益就是 \(\sum (w[i] \times time[i])\)

接下来考虑计算一条边经过次数:

我们设这一条边的两个端点分别为 \(u\)\(v\),用 \(size[i]\) 表示以 \(i\) 为根的子树的大小,\(black[i]\) 表示以 \(i\) 为根的子树的黑色点个数,\(white[i]\) 表示以 \(i\) 为根的子树的白色点个数,那么有:

\(time[i]=black[u] \times black[v] + white[u] \times white[v]\)

且恒有 \(size[x]=white[x]+black[x]\)

动态规划:

\(f[u][i]\) 表示 \(u\) 的子树中选 \(i\) 个黑色点所获得的最大收益,枚举点 \(u\) 的出边,设出边所到的点为 \(v\) 那么分别枚举以 \(u\)\(v\) 为根的子树选多少个黑色的点更新答案即可。

注意这里要由大到小枚举选点数量,因为转移是由小范围到大范围,如果由小到大枚举就会用到之前更新的答案导致重复计算。

动态规划不是本题重点,因此不过多赘述,请结合数学部分以及代码理解。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, k;
ll head[2005], cnt;
ll f[2005][2005], size[2005];
struct node {ll v, w, ne;
}e[5005];
void add(ll u, ll v, ll w) {e[++cnt]={v, w, head[u]};head[u]=cnt;
}
void dfs(ll u, ll fa) {size[u]=1;for(int i=head[u], v; i; i=e[i].ne) {v=e[i].v;if(v==fa) continue;dfs(v, u);for(int x=size[u]; x>=0; x--) { //枚举u子树选多少点for(int y=size[v]; y>=0; y--) { //v子树选多少点if(x+y>k) continue; //越界跳过ll time=(y*(k-y))+((size[v]-y)*(n-k-size[v]+y));/*(y*(k-y))表示black[v]*black[v]*//*((size[v]-y)*(n-k-size[v]+y))表示white[v]*white[u]*/f[u][x+y]=max(f[u][x+y], f[u][x]+f[v][y]+e[i].w*time); //f[u][x+y]由f[u][x]和f[v][y]转移过来,所以要倒序枚举}}size[u]+=size[v];}
}
int main() {cin >> n >> k;for(int i=1; i<n; i++) {ll u, v, w;cin >> u >> v >> w;add(u, v, w), add(v, u, w);}dfs(1, 0);cout << f[1][k];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835972.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.11.18 鲜花

浅谈多线程浅谈多线程打上花火 あの日(ひ)见渡(みわた)した渚(なぎさ)を 那天所眺望的海岸 a no hi mi wa ta shi ta na gi sa wo 今(いま)も思(おも)い出(だ)すんだ 直至今日仍能想起 i ma mo o mo i da su n da 砂(すな)の上(うえ)に刻(きざ)んだ言叶(ことば) 在沙滩上刻下的…

Rocky9.3安装snipe-it

全新安装最小化rocky 使用root用户登入系统,避免之后麻烦 安装几个工具yum -y install net-tools wget vim gcc按照官方文档要求安装必须的软件我们首先安装一下php,因为现在仓库中的php版本不满足8.1以上的要求,所以我们到php官网下载8.3.13使用wget下载到根目录下的tmp好了…

【圆圆的日语教室】日语入门第2课-平假名的书写+了解日本

第二课 相似的假名平假名的书写あ (a) 的书写第二笔不要太直,它是从草书演变过来的,特点是圆润有弧度 第三笔要交叉 长得像“安”い (i) 的书写第一笔要勾上去う (u) 的书写第一笔:点第二笔:起笔不要太平,先往上走再往下拐。联想记忆:u住耳朵え (e) 的书写联想:e,见到一…

Scrum 冲刺博客-day3

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 Scrum 冲刺博客-day3团队成员 梁志聪 李永杰 曾繁曦一、会议照片二、工作情况成员 昨天已完成工作 今日计划工作梁志聪 编写主菜单,人物移动相关代码 设计障碍物,实现人物碰撞李永杰 构思大…

基于RDK X5的智慧交通监控系统

本Blogs同步发表至CSDN:https://blog.csdn.net/xiongqi123123/article/details/143840675?sharetype=blogdetail&sharerId=143840675&sharerefer=PC&sharesource=xiongqi123123&spm=1011.2480.3001.8118 一、项目背景在当前高等教育普及化、大学持续扩招的宏…

【ai+模型】五大主流开源大模型RAG评估框架详解

RAG 评估的挑战 增强检索生成技术(Retrieval Augmented Generation,简称 RAG)目前正成为增强大语言模型(LLM)性能的核心手段。该技术通过将外部知识库融入LLM,大幅提升了大模型的精确度和对上下文的感知力。然而,对 RAG 系统性能的评测颇具挑战,这促使了一系列开源 RAG…

【待发】CyberEdge:简洁而强大的互联网资产测绘工具

免责声明 利⽤本文所提供的信息而造成的任何直接或者间接的后果及损失,均由使⽤者本⼈负责,创作者及作者不为此承担任何责任,一旦造成后果请自行承担责任!简介: CyberEdge是一款精心设计的互联网资产测绘工具,为网络安全专业人士提供精准、高效的扫描体验。 核心特性: 全…

Spring Security 认证授权(黑马讲义)

1.基本概念 1.1.什么是认证 用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。 1.2.什么是授…

SkyWalking 安装部署操作指引

环境 CentOS-7-x86_64-DVD-2009.iso https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso apache-skywalking-apm-10.0.1.tar.gz https://dlcdn.apache.org/skywalking/10.0.1/apache-skywalking-apm-10.0.1.tar.gz jdk-11.0.23_linux-x64_bin.tar.…

Win11 24H2 使用Rclone将SMB协议链接转为本地磁盘驱动器

9月份升级了ITX主机,多了好几块机械硬盘, 后来又买了Nas, 先装了飞牛Nas系统, 结果要格盘,考虑到Refs, Zfs, exFAT 在坏盘情况对数据恢复不友好, 决定改用Win11作为Nas 系统 .Windows 做Nas 系统不要太好, 免去各类docker 的缓慢和配置,可以正常使用迅雷等各类软件,并且很多Nas…

在Keil中使用ST-LINK烧录STM32程序指南

前言 之前玩STM32都是用J-LINK烧录程序,不仅便捷,而且烧录的速度比用串口快好多。 最近我接了几个32单片机的毕设单子,便买了几块C8T6的最小系统板用来开发。最初我还是用J-LINK烧录C8T6的,只要从J-LINK中找出对应的引脚用杜邦线连上就可以烧录,但是每晚要去学校的实验室,…

第八章习题

学号后四位:3018 8.4:点击查看代码 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt# 定义微分方程组 def differential_equations(state, t):x, y = statedxdt = -x ** 3 - ydydt = x - y ** 3return [dxdt, dydt]# 设定初始条件 ini…