[BZOJ4987] Tree

题目大意:从前有棵树,找出\(K\)个结点\(A_1, A_2, A_3,\cdots A_k\),使\(\sum\limits_{1 \leq i \leq K-1}{} dis(A_i,A_{i+1})\)

Solution

先画一个样例图

延伸出两个结论

  1. 选出的点集一定是一个联通树; 因为如果不连通,即点集在树上有不相邻的,那么完全可以选两个不相邻的点中间的点进入点集,一定更优

  2. 和最小的情况下,有一条链只经过一遍,剩余的边要经历两次; 这个配合样例图,画一画就可以

  • 状态:\(f[i][j][k]\)表示以\(i\)为根节点且\(i\)必须选,在他的子树里面取\(j\)条边,有\(k\)个子节点是链的端点的最小花费

复杂度:相当于在\(i​\)为根的子树中枚举点对\((u,v)​\),且两者不在一个子树中,所以只有当找到\(lca(v,u)​\)才能找到点对\((u,v)​\),所以时间复杂度为\(O(n^2)​\)

Code

#include <bits/stdc++.h>using namespace std;const int N = 3000 + 10;int n, k, ecnt, ans = 2147483647;
int head[N], siz[N];
int f[N][N][4];struct Edge {int to, next, val;
}e[N << 1];inline void adde(int x, int y, int z) {e[++ecnt].to = y;e[ecnt].next = head[x];e[ecnt].val = z;head[x] = ecnt;
}void dfs(int x, int fa) {siz[x] = 1;f[x][0][0] = f[x][0][1] = 0;//没选边,没有端点或此结点作为一条链的端点,那么花费为0for(int i = head[x]; i; i = e[i].next) {if(e[i].to == fa) continue;dfs(e[i].to, x);for(int j = siz[x] - 1; j >= 0; --j)//选的边最多都是size - 1,下文j+k+1也是说明选的边最多都是size - 1for(int k = siz[e[i].to] - 1; k >= 0; --k)for(int l = 2; l >= 0; --l)//枚举此结点的端点数for(int m = l; m >= 0; --m)//2 - (m & 1) 是如果两或零个端点都在这个子节点的话, 那么当前结点到此子节点的这段路是不包含在主链里的,要乘二 f[x][j + k + 1][l] = min(f[x][j + k + 1][l], f[e[i].to][k][m] + f[x][j][l - m] + e[i].val * (2 - (m & 1))); siz[x] += siz[e[i].to];//在最后加上子节点的size是因为,多叉树,两个两个合并 }
}int main() {scanf("%d %d", &n, &k);for(int i = 1, la, lb, lc; i <= n - 1; ++i) {scanf("%d %d %d", &la, &lb, &lc);adde(la, lb, lc);adde(lb, la, lc);}memset(f, 0x3f, sizeof(f));//初始化dfs(1, 0);for(int i = 1; i <= n; ++i)for(int j = 0; j <= 2; ++j)ans = min(ans, f[i][k - 1][j]);printf("%d", ans);return 0;
}

转载于:https://www.cnblogs.com/LMSH7/p/9706085.html

[BZOJ4987] Tree相关推荐

  1. [BZOJ4987]Tree

    题目大意: 给定一棵\(n(n\le3000)\)个点的带边权的树,找出\(k\)个点\(A_{1\sim k}\)使得\(\sum_{1\le i<k} dis(A_i,A_i+1)\)最小. ...

  2. bzoj4987: Tree(树形dp)

    Description 从前有棵树. 找出K个点A1,A2,-,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一行两个正整数n,k,表示数的顶点数和需要 ...

  3. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  4. 107. Binary Tree Level Order Traversal II

    题目 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from l ...

  5. 102. Binary Tree Level Order Traversal

    题目 Binary Tree Level Order Traversal 层次遍历二叉树 链接 Given a binary tree, return the level order traversa ...

  6. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  7. [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  8. Code Forces Bear and Forgotten Tree 3 639B

    B. Bear and Forgotten Tree 3 time limit per test2 seconds memory limit per test256 megabytes inputst ...

  9. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

最新文章

  1. Yarn 组件的指挥部 – 调度器Scheduler
  2. BZOJ3172 [Tjoi2013]单词 字符串 SA ST表
  3. oracle 回收undo,oracle 释放undo空间
  4. 卷积神经网络(CNN)新手指南 1
  5. java createstatement,createStatement参数说明
  6. android tv 蓝牙服务_打电话、看电话,听清大千世界,不单只有助听器,力斯顿的尖端配件“无线通”“TV伴侣”了解一下。...
  7. mysql 数据库的维护,优化
  8. The Dataflow Model: A Practical Approach to Balancing
  9. 星露谷服务器上没有空闲位置,星露谷 我在社区中心背面藏了些东西 | 手游网游页游攻略大全...
  10. aspectjweaver.jar aspectjrt.jar
  11. linux系统软件包下载
  12. Android页面引导蒙版(浮层)库
  13. java学习篇(一)---从网络下载图片
  14. Lagrange’s Mean Value Theorem - 拉格朗日中值定理
  15. 一起来学SpringCloud之 - 服务认证(JWT)
  16. html文件做屏保win10,给Win10系统设置一个漂亮屏保的三种方法(图文)
  17. KUCAS清关文件申请形式 TER与TIR认证介绍
  18. 【报告分享】2022快手磁力金牛家居百货行业营销洞察报告-磁力引擎(附下载)
  19. react在线编辑Excel表格
  20. 从零搭建基于 Java 的服务器生产环境

热门文章

  1. php是视频还是图片格式,php 视频、音频和图片文件上传,该如何解决
  2. 计算机网络的硬盘组成,大卸八块!编辑为你揭秘硬盘的内部结构
  3. Linux之web服务
  4. 查询服务器系统类型有哪些,查看服务器的操作系统类型
  5. Markdown编辑LaTeX数学公式
  6. Arcgis执行Raster Project时报Error001143 : Background server threw an exception
  7. 深入浅出Docker(二):Docker命令行探秘
  8. elementUI中radio的相关使用
  9. java中主函数_(基础)java中的主函数
  10. 大学学python用记笔记吗_学 Python 作笔记,怎么能不用 Jupyter