Tree

Description

从前有棵树。
找出$k$个点$A_1,A_2,…,A_k$。
使得$\sum_{1\leq i \leq k-1}dis(A_i,A_{i+1})$最小。

Input

第一行两个正整数$n,k$,表示树的顶点数和需要选出的点个数。
接下来$n-1$行每行$3$个非负整数$x,y,z$,表示从存在一条从$x$到$y$权值为$z$的边。

Output

一行一个整数,表示最小的距离和。
 
 
题解:
不难发现,选取的$k$个点在原树上是一个联通子树,考虑树形DP。
最终选取的$k$个点一定是从其中最远点对的一个点沿着直径同时遍历接在直径上的每一棵子树来到另一个点。
但是其实我们可以完全不考虑那么多,
就只需要把它想成沿着一个点出发遍历其他的点最终不需回到原来的点即可。
于是我们的状态就很显然,对于每一个节点$x$:
$C[x][m]$表示,起点和终点为$x$所在子树的任意一点,途径$x$所在的子树,共计遍历了$m$个不同点的最小代价。
$F[x][m]$表示,起点和终点中有一点为$x$所在子树的任意一点且另一点为$x$,途径$x$所在的子树,共计遍历了$m$各不同点的最小代价。
$B[x][m]$表示,起点和终点均为$x$,途径$x$所在的子树,共计遍历了$m$个不同的点的最小代价。
转移就很好写,DFS时,从大到小枚举一个点的前若干个子树大小之和,同时从大到小枚举当前子树大小,更新当前根节点的答案即可。
这样的复杂度相当于在以$x$为根的子树中枚举点对,且这两个点分别在不同儿子的子树中。因此,对于任意点对$(u,v)$,当且仅当DFS到$lca(u,v)$时会被枚举到,因此时间复杂度综合为$O(n^2)$。
 
AC代码如下
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 3020
using namespace std;
int read(){int nm=0,fh=1;char cw=getchar();for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');return nm*fh;
}
int n,m,fs[M],nt[M<<1],to[M<<1],len[M<<1];
int ans,F[M][M],B[M][M],C[M][M],dst,tmp,u,v,sz[M];
void update(int &x,int y){x=min(x,y);}
void link(int x,int y){nt[tmp]=fs[x],fs[x]=tmp,to[tmp]=y,len[tmp++]=dst;}
void DP(int x,int last){sz[x]=1,F[x][1]=C[x][1]=B[x][1]=0;for(int i=fs[x];i!=-1;i=nt[i]){if(to[i]==last) continue;int v=to[i]; DP(v,x);for(int k=sz[x];k>0;k--){for(int j=sz[v];j>0;j--){update(B[x][j+k],B[v][j]+B[x][k]+(len[i]<<1));update(F[x][j+k],min(B[v][j]+F[x][k]+len[i],F[v][j]+B[x][k])+len[i]);update(C[x][j+k],min(min(C[x][k]+B[v][j],C[v][j]+B[x][k])+len[i],F[x][k]+F[v][j])+len[i]);}}sz[x]+=sz[v];}update(ans,min(min(C[x][m],B[x][m]),F[x][m]));
}
int main(){n=read(),m=read(),memset(&ans,0x7f,sizeof(int));memset(fs,-1,sizeof(fs)),memset(F,0x7f,sizeof(F));memset(C,0x7f,sizeof(C)),memset(B,0x7f,sizeof(B));for(int i=1;i<n;i++) u=read(),v=read(),dst=read(),link(u,v),link(v,u);DP(1,0),printf("%d\n",ans);return 0;
}

 

转载于:https://www.cnblogs.com/OYJason/p/9431219.html

BZOJ4987 Tree相关推荐

  1. [BZOJ4987] Tree

    [BZOJ4987] Tree 题目大意:从前有棵树,找出\(K\)个结点\(A_1, A_2, A_3,\cdots A_k\),使\(\sum\limits_{1 \leq i \leq K-1} ...

  2. [BZOJ4987]Tree

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

  3. bzoj4987: Tree(树形dp)

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

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

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

  5. 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 ...

  6. 102. Binary Tree Level Order Traversal

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

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

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

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

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

  9. 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 ...

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

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

最新文章

  1. GAN版马里奥创作家来了:一个样本即可训练,生成关卡要素丰富 | 开源
  2. android studio miui8,MIUI8上在Android Studio运行出错集及其解决方案
  3. python类中方法的执行顺序-Python中实例化class的执行顺序示例详解
  4. 函数 —— fgets()
  5. 蓝牙L2CAP剖析(二)
  6. 数据库入门开发案例,真的是入门级别的!!看了不后悔。
  7. Tiny之Web工程构建
  8. mysql执行系统命令_mysql 命令行执行 sql
  9. python程序—名片管理系统
  10. 图解exports 和 module.exports
  11. 软工网络15团队作业4——Alpha阶段敏捷冲刺-3
  12. Http代理抓包 Fiddler与Charles
  13. CSDN Blog推出专属的离线发布工具 - CSDN剪影
  14. 社区发现算法之——Louvain
  15. win7录屏_录屏软件推荐用什么?绝地求生录屏游戏的工具分享
  16. IDEA 创建工作空间 (空项目) 项目组
  17. 如何确定自己的科研课题?
  18. Discuz论坛管理员密码忘记重置
  19. Android 开发2048 无法显示gameView、Card
  20. 计算机无法启动bios,开机进入bios无法进入系统怎么办_电脑开机就进入bios的解决方法...

热门文章

  1. Python字典知识总结
  2. windows用VS2019下编译log4cxx日志库
  3. Android编程权威指南第三版 第32章
  4. openlayers 地图上加图标_OpenLayers学习笔记中级篇(四、地图图标操作)
  5. python ——找出 每行中长度超过3的单词
  6. 交换机之三层交换原理
  7. 【2019.05.23】JS逆向——破解裁判文书网参数(vl5x,guid )爬虫 超级详细
  8. 80C51单片机的基本信息
  9. 山东理工ACM 1115 C语言实验——交换两个整数的值(顺序结构)两种方法
  10. 一文搞懂 deconvolution、transposed convolution、sub-­pixel or fractional convolution