当前位置: 首页 > news >正文

O - Color a Tree

题意:任务是在一棵树状结构中以最小的成本完成所有节点的染色,如果要染一个节点那么他的父节点必须已经染过色。染色成本取决于节点的染色成本因子与染色时间。通过分析得出正确的染色策略,并给出了一种有效的算法实现。

错误的贪心策略:对于一个节点的子节点 染过这个结点之后 就递归到他的所有子树节点中权值最大的点所在的子树 但是这种贪心策略是错误的 比如 一个节点有左右子树 子树中最大的节点在右子树 但是左、右子树的节点个数远远大于左子树的节点个数但是右子树中的节点最大值又仅仅大于左子树节点最大值+1 或者只大于一点 这个最大值又位于非常深的位置 那么按照我这种贪心策略 也就是先染右子树 那么这种策略就会使左子树的节点都等待右子树节点的个数的时间 那么就会使答案更大 所以这种贪心策略是错误的

正确的贪心策略:树中除根节点外最大的点,一定会在它的父节点被染色后立即染色。 对于两个点集A,B 假设先选A,会让B中所有点“等待”ca次选点 若要选择A更优,则有w[b]cnt1[a] < w[a]cnt1[b],便得到了w[b]/cnt1[b] < w[a]/cnt1[a],即A中点权的平均数要较大。那么我们的贪心策略便可以变为:树上所有点集中点权算术平均数最大的点集A的父亲F被选择后, 应该立刻选择A,(具体w,cnt1数组含义看代码即可)。

题解:首先dfs处理出来每个子树的节点个数和权值 然后在合并的过程中对于一个节点的所有子节点 找到权值平均数最大的子节点 记录贡献并把这个子节点合并给当前他的父节点 即可时间复杂度 O(n²)

const int N = 1010;
int mx[N], w[N], c[N], cnt[N], ans[N];
vi G[N];
bool cmp(pii a, pii b) {return 1LL * w[a.first] * cnt[b.first] > 1LL * w[b.first] * cnt[a.first];
}
void dfs0(int u, int fa) {mx[u] = fa;cnt[u] = 1;w[u] = c[u];rep0(i, G[u].size()) {int v = G[u][i];if (v == fa) {continue;}dfs0(v, u);cnt[u] += cnt[v];w[u] += w[v];}
}
void dfs1(int u, int fa) {if (!cnt[u]) {ans[u] = 0;return;}vi p(cnt[u] + 1), s(cnt[u] + 1), cnt1(cnt[u] + 1), vis(cnt[u] + 1);rep1(i, cnt[u]) {p[i] = mx[i];s[i] = c[i];cnt1[i] = 1;vis[i] = 0;}i64 res = 0;rep1(i, cnt[u]) { res += c[i]; }rep1(i, cnt[u] - 1) {int idx = -1;double mn = -1e300;rep1(j, cnt[u]) {if (j == u || vis[j]) {continue;}double v = (double)s[j] / (double)cnt1[j];if (v > mn) {mn = v;idx = j;}}if (idx == -1) {break;}vis[idx] = 1;res += s[idx] * cnt1[p[idx]];rep1(j, cnt[u]) {if (p[j] == idx) {p[j] = p[idx];}}s[p[idx]] += s[idx];cnt1[p[idx]] += cnt1[idx];}ans[u] = res;}
void solve() {int m, R;while (cin >> m >> R) {if (m == 0 && R == 0) {break;}rep1(i, m) {G[i].clear();cnt[i] = w[i] = ans[i] = 0;}rep1(i, m) { cin >> c[i]; }rep0(i, m - 1) {int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}dfs0(R, -1);dfs1(R, -1);cout << ans[R] << "\n";}
}
http://www.rkmt.cn/news/6526.html

相关文章:

  • 前 k 小问题期末考
  • lvm硬盘分区与不分区优缺点
  • 中电金信能碳虚拟电厂数智化平台破局“双碳”难题
  • milvus创建一个用户管理多个库
  • 为什么ceph新添加的硬盘会自动变为osd
  • OF SF CF ZF 的判断方式以及例子
  • 2025年30个CRM系统盘点:哪款CRM系统适合你的企业? - SaaS软件
  • TSN Qav测试实践
  • 燕千云ITR平台引领服务流管理革命,构建企业客户服务智慧生态
  • Gitee推出革命性MCP Server:AI深度参与开发全流程 开启智能协作新时代
  • 取证 - voasem
  • 【SPIE独立出版|连续多年EI稳定检索】第七届地球科学与遥感测绘国际学术会议(GRSM 2025)
  • Python psutil模块
  • AI赋能CRM:纷享销客智能图像提升终端运营效率
  • 【linux命令】网卡命令 ①
  • 一款基于 .NET 开源美观、功能丰富的串口调试工具
  • 麒麟系统中docker常用命令
  • 在Oracle中,如何彻底停止expdp进程?
  • 服务器文件同步工具大盘点
  • 基于Python+Vue开发的酒店客房预订管理系统源码+运行步骤
  • 解锁RAG高阶密码:自适应、多模态、个性化技术深度剖析
  • 软件逆向入门理论
  • P1115 最大子段和
  • Windows Server 2019开启远程桌面无法远程处理
  • 一位华裔数学家40年目睹之怪现状:美国学生的数学为什么那么差?
  • 英语_阅读_
  • Flutter数据可视化:fl_chart图表库的高级应用
  • 2025 年 PHP 常见面试题整理以及对应答案和代码示例
  • 2025介绍1个简单好用免费的版权符号复制生成网站
  • U3D 动作游戏开发中数学知识的综合实践案例