Description

从前有棵树。
找出K个点A1,A2,…,Ak。
使得∑dis(AiAi+1),(1<=i<=K-1)最小。

Solution

这道题首先要用到一个结论,即ans=最小的包含A1到Ak的连通块中所有边的和×2−这个连通块直径ans=最小的包含A_1到A_k的连通块中所有边的和\times 2-这个连通块直径ans=最小的包含A1​到Ak​的连通块中所有边的和×2−这个连通块直径正确性显然。其实是我不会证明。
而使这个取到最小,连通块大小一定是kkk。于是就可以树形DP,fx,i,0/1/2f_{x,i,0/1/2}fx,i,0/1/2​表示以xxx为根的子树中选了iii个点,直径有多少个端点在这个连通块中的最小权值即可。
以后做树形DP一定要注意dfsdfsdfs儿子的时候会不会改变一些全局数组啊,因为这个搞了好久……

Code

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pa pair<int,int>
const int Maxn=3010;
const LL inf=1LL<<60;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;
}
void cmin(LL&x,LL y){x=min(x,y);}
int n,k,sz[Maxn];LL f[Maxn][Maxn][3],g[Maxn][3];
struct Edge{int y,next;LL d;}e[Maxn<<1];
int last[Maxn],len=0;
void ins(int x,int y,LL d)
{int t=++len;e[t].y=y;e[t].d=d;e[t].next=last[x];last[x]=t;
}
void dfs(int x,int fa)
{f[x][1][0]=f[x][1][1]=f[x][1][2]=0;sz[x]=1;memset(g,63,sizeof(g));for(int i=last[x];i;i=e[i].next){int y=e[i].y;if(y==fa)continue;dfs(y,x);for(int j=1;j<=min(k,sz[x]);j++)for(int l=1;l<=sz[y]&&j+l<=k;l++)cmin(g[j+l][0],f[x][j][0]+f[y][l][0]+(e[i].d<<1));for(int j=1;j<=min(k,sz[x]);j++)for(int l=1;l<=sz[y]&&j+l<=k;l++)cmin(g[j+l][1],min(f[x][j][0]+f[y][l][1]+e[i].d,f[x][j][1]+f[y][l][0]+(e[i].d<<1)));for(int j=1;j<=min(k,sz[x]);j++)for(int l=1;l<=sz[y]&&j+l<=k;l++)cmin(g[j+l][2],min(min(f[x][j][0]+f[y][l][2],f[x][j][2]+f[y][l][0])+(e[i].d<<1),f[x][j][1]+f[y][l][1]+e[i].d));sz[x]+=sz[y];for(int j=1;j<=sz[x];j++)for(int l=0;l<3;l++)cmin(f[x][j][l],g[j][l]);}memset(g,63,sizeof(g));
}
int main()
{memset(f,63,sizeof(f));n=read(),k=read();for(int i=1;i<n;i++){int x=read(),y=read(),d=read();ins(x,y,d),ins(y,x,d);}dfs(1,0);LL ans=inf;for(int i=1;i<=n;i++)cmin(ans,f[i][k][2]);printf("%lld",ans);
}


[BZOJ]4987: Tree 树形DP相关推荐

  1. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...

  2. 2021牛客多校4 - Rebuild Tree(树形dp)

    题目链接:点击查看 题目大意:给出一棵 nnn 个节点的树,现在可以删掉 kkk 条边,然后加上 kkk 条边,问有多少种方案使得操作后 nnn 个点仍然是一棵树 题目分析:原树删掉 kkk 条边后会 ...

  3. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  4. HDU 5834 Magic boy Bi Luo with his excited tree 树形DP

    Magic boy Bi Luo with his excited tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5834 Descript ...

  5. LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP

    题目链接:点这里 题解: 需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央. 然后树形DP 设定dp[i][0/1] 以1为根的情况下,以i 节点下子树 ...

  6. bzoj 1369: Gem 树形dp

    题目大意 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小.N<=10000 题解 我们可以 ...

  7. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  8. VK Cup 2012 Round 1 D. Distance in Tree (树形dp)

    题目:http://codeforces.com/problemset/problem/161/D 题意:给你一棵树,问你两点之间的距离正好等于k的有多少个 思路:这个题目的内存限制首先大一倍,他有5 ...

  9. ARC101E Ribbons on Tree 树形dp 容斥

    题目链接 题意: 给你一棵nnn个点的树,nnn是偶数,把这些点分成n2\frac{n}{2}2n​个点对,每个点对会把路径上的所有边覆盖,问你每条边至少覆盖一次有多少种配对方式.n<=5000 ...

  10. A. Parsa‘s Humongous Tree(树形DP + 贪心)

    Problem - 1528A - Codeforces 两个玩家正在玩一个游戏.他们有一个整数1,2,...,n的排列组合(排列组合是一个数组,其中从1到n的每个元素正好出现一次).这个排列组合没有 ...

最新文章

  1. C语言基础知识(自己做个笔记,云储存一下)
  2. token 的设计方案
  3. python求分段函数值_高中数学知识点整理(2)——函数概念及基本初等函数篇(上)...
  4. 通俗易懂的讲解一下Java的代理模式
  5. python简易版成绩管理系统_Python 实现简易版成绩管理系统
  6. AngularJS的学习笔记(一)
  7. 带有Jersey和Spring的RESTful Web应用程序
  8. Extjs TextField扩展
  9. linux安装之后缺少命令,Centos 7 最小安装后关键命令找不到 ifconfig等
  10. android常用的工厂模式,Android的设计模式-简单工厂模式
  11. ADO.NET数据集的工作原理(DataSet)
  12. hp服务器引导驱动器,windows-server-2008 – 在没有SmartStart的HP Proliant服务器上安装Windows...
  13. python中if __name__ == __main__:用法解析
  14. FusionChartsFree调用json数据的简单例子
  15. ev3编程和python编程哪个好_上海市Python编程课程怎么选机构,ev3编程课程怎么选机构...
  16. 【PID控制与模糊PID控制的比较】(带仿真和代码链接)
  17. datavideo切换台说明书_GoPro结合洋铭切换台现场节目制作
  18. gitbub 上删除仓库
  19. 一台电脑绿色安装多个版本google Chorme方案
  20. Mac自定义触控栏 Touch Bar的显示教程

热门文章

  1. DirectX天空球和天空盒子模型
  2. Java学习--多线程案例--模拟火车票销售(线程安全问题)
  3. undefined reference to 的报错原因记录
  4. Python web客户端编程简单示例
  5. C语言:鸡兔同笼(随机输入头数和脚数)
  6. llvm如何使用vc编译器_使用LLVM框架创建可用的编译器,第1部分
  7. Arduino UNO u8glib显示中文-亲测可用
  8. Android模拟器知识以及改造
  9. 74HC595级联电路编程篇(四)
  10. c语言程序设计对称数,对称数 问题