题意:给你一棵树,要选择若干节点,若一个点i没有选择,则有\(d(dis(i,j))\)的代价,其中j被选择。选择一个点代价为k,求最小代价。
首先,考虑这样一个问题:
如果距离a的最近被选点为i,距离b的最近被选点也是i,那么a到b的路径上的点的最近被选点都是i。
考虑一条链:设Ax是链上第x个点,那么点y到Ax的距离fy(x)随x的增加,先下降,再上升。(这个显然)。
那么假设a到b路径上的c,最近点不是i而是j。
那么,\(dis(a,i)<dis(a,j),dis(c,i)>dis(c,j),dis(b,i)<dis(b,j)\)。
就是说\(fi\)和\(fj\)有两个交点。但这是不可能的。
所以,如果距离a的最近被选点为i,距离b的最近被选点也是i,那么a到b的路径上的点的最近被选点都是i一定成立。
换句话说,以i为最近点的j是一个连通块。
这样,我们设\(dp(i,j)\)表示i的最近点是j的状态。再维护\(f(i)\)表示\(dp(i,j)\)的最小值。
那么,对于i的每个儿子v,枚举它的最近点a,则转移到\(dp(v,a)\)。
但如果\(j=a\),那么对于v来说,a已经选择过了,则转移到\(dp(v,a)-k\)。
维护\(f(i)\)后就是\(dp(i,j)=min(f(v),dp(v,j)-k)+d(dis(i,j))+k\)。
因为要输出方案,再记录一下转移的位置。
\(dis\)数组可以\(O(n^2)\)预处理出。
代码:

#include <stdio.h>
int fr[182],ne[362],v[362],bs = 0;
void addb(int a, int b) {v[bs] = b;ne[bs] = fr[a];fr[a] = bs++;
}
int dp[182][182],wz[182],sz[182],cd[182][182],n,k;
int fa[182],sd[182],ans[182],zy[362][182];
void dfs0(int u, int f) {fa[u] = f;sd[u] = sd[f] + 1;for (int i = fr[u]; i != -1; i = ne[i]) {if (v[i] != f) dfs0(v[i], u);}
}
int dfscd(int a, int b) {if (a == b) return 0;if (cd[a][b]) return cd[a][b];if (sd[a] > sd[b]) cd[a][b] = dfscd(fa[a], b) + 1;else cd[a][b] = dfscd(a, fa[b]) + 1;return cd[a][b];
}
void dfs(int u, int f) {for (int i = fr[u]; i != -1; i = ne[i]) {if (v[i] != f) dfs(v[i], u);}for (int a = 1; a <= n; a++) {dp[u][a] = sz[cd[u][a]] + k;for (int i = fr[u]; i != -1; i = ne[i]) {if (v[i] == f) continue;int t = dp[v[i]][wz[v[i]]];if (dp[v[i]][a] - k < t) {t = dp[v[i]][a] - k;zy[i][a] = a;} else zy[i][a] = wz[v[i]];dp[u][a] += t;}if (a == 1 || dp[u][a] < dp[u][wz[u]]) wz[u] = a;}
}
void dfs1(int u, int f, int a) {ans[u] = a;for (int i = fr[u]; i != -1; i = ne[i]) {if (v[i] != f) dfs1(v[i], u, zy[i][a]);}
}
int main() {scanf("%d%d", &n, &k);for (int i = 1; i <= n; i++) fr[i] = -1;for (int i = 1; i < n; i++) scanf("%d", &sz[i]);for (int i = 0; i < n - 1; i++) {int a,b;scanf("%d%d", &a, &b);addb(a, b);addb(b, a);}dfs0(1, 0);for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (i != j && cd[i][j] == 0) dfscd(i, j);}}dfs(1, 0);int z = 1;for (int i = 2; i <= n; i++) {if (dp[1][i] < dp[1][z]) z = i;}printf("%d\n", dp[1][z]);dfs1(1, 0, z);for (int i = 1; i <= n; i++) printf("%d ", ans[i]);return 0;
}

CF70E Information Reform 题解相关推荐

  1. CF70E Information Reform

    题意:给你一棵树,要选择若干节点,若一个点i没有选择,则有\(d(dis(i,j))\)的代价,其中j被选择.选择一个点代价为k,求最小代价. 首先,考虑这样一个问题: 如果距离a的最近被选点为i,距 ...

  2. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Jav ...

  3. 2019秋季PAT甲级_C++题解

    2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...

  4. 2019 ICPC中国邀请赛(南昌)暨国际丝绸之路程序设计竞赛-网络赛题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:10/13 ABCDHIJKLM A. PERFECT NUMBER PROBLEM 解题思路:先编写离线程序计算出最小的5个 ...

  5. 攻防世界 CRYPTO 新手练习区 答题(1-12题解)

    序 传送门:https://adworld.xctf.org.cn/task/ 1.base64 题目描述:元宵节灯谜是一种古老的传统民间观灯猜谜的习俗. 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气 ...

  6. HITCTF2018-web全题解

    点击蓝字 关注我们 前记 最近参加了一下哈工大办的HITCTF,感觉题目可以学到知识,于是分享一下我的题解~ 01 PHPreading 发现文件泄露 http://198.13.58.35:8899 ...

  7. LeetCode 831. Masking Personal Information【字符串,正则表达式】中等

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12.由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止:由于LeetCode还在不断地创建新 ...

  8. HDU 6105 Gameia 树上博弈(思路题)(内附官方题解)

    题目  :Gameia:链接 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

  9. Vulnhub靶场题解

    Vulnhub简介 Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行 ...

最新文章

  1. swift 语言评价
  2. 你需要了解的load和initialize
  3. Azure运维系列 3:善用Azure捕获功能事半功倍
  4. ITK:计算网格的平面参数化
  5. Ant build.xml中的各种变量
  6. java学习(七)java中抽象类及 接口
  7. 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)
  8. 使用jd-gui+javassist修改已编译好的class文件
  9. Alibaba Nacos配置中心功能介绍与不同命名空间、分组等配置
  10. 如何设置电脑自动锁屏_Apple ID密码忘了怎么重置?丨如何让面容和指纹解锁立马失效?...
  11. css 伪类 :fullscreen 应用于当前处于全屏显示模式的元素。
  12. 利用apktool查看apk源代码
  13. 国产存储芯片,emmc,性能强
  14. SAP中非限制到冻结库存的相互转换操作测试过程记录
  15. 基于激活聚类的后门检测:Detecting Backdoor Attacks on Deep Neural Networks by Activation Clustering
  16. COS操作 java实现
  17. TRS过期后解决办法
  18. CodeForces 158B Taxi(代数算式解题)
  19. 搭建属于自己的数字IC EDA环境(五):搭建FPGA自动化环境(Linux下vivado Tcl脚本自动化开发),业余IC设计流程与通路
  20. 试探讨暴风影音2014笔试题

热门文章

  1. h5免签聚合支付系统yy支付-y币+yy陪玩-系统源码
  2. 建一个网站需要哪些费用?(硬件方面)
  3. 江苏计算机二级英语,江苏计算机等级考试什么时候出结果(江苏省计算机二级考试内容)...
  4. iframe父子页面间数据交互
  5. PS照片合成制作温馨的母女情深贺卡-PS制作贺卡教程
  6. 前端性能优化的一些技巧(90% chatGpt生成)
  7. 使用linux记事本的技巧
  8. 企业宣传片文案撰写思路
  9. zSpace实现点击任意键(笔或者键盘)响应
  10. 使用mono-repo实现跨项目组件共享