Written with StackEdit.

Description

从前有棵树。

找出\(K\)个点\(A_1,A_2,…,A_K\)。

使得\(∑dis(A_i,A_{i+1}),(1<=i<=K-1)\)最小。

Input

第一行两个正整数\(n,k\),表示数的顶点数和需要选出的点个数。

接下来\(n-1\)行每行3个非负整数\(x,y,z\),表示从存在一条从\(x\)到\(y\)权值为\(z\)的边。

\(1<=k<=n\)

\(1<x,y<=n\)

\(1<=z<=10^5\)

\(n <= 3000\)

Output

一行一个整数,表示最小的距离和。

Sample Input

10 7

1 2 35129

2 3 42976

3 4 24497

2 5 83165

1 6 4748

5 7 38311

4 8 70052

3 9 3561

8 10 80238

Sample Output

184524

Solution

  • 注意到选择的点集一定是两两相邻的.
  • 那么选出的点中,只有一条链可以只经过一次,其余的需要经过两次.
  • 考虑树形背包选边,令\(f(i,j,k)\)表示在子树\(i\)中选出\(j\)条边的最小代价,
    • \(k=0\):回到根节点.
    • \(k=1\):不回到根节点.
    • \(k=2\):回到根节点后再下去.
#include<bits/stdc++.h>
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
const int MAXN=3e3+10;
int cnt=0,head[MAXN];
int nx[MAXN<<1],to[MAXN<<1],val[MAXN<<1];
inline void add(int u,int v,int w)
{
++cnt;
nx[cnt]=head[u];
to[cnt]=v;
val[cnt]=w;
head[u]=cnt;
}
int f[MAXN][MAXN][3],siz[MAXN];
inline void upd(int &x,int y)
{
if(x>y)
x=y;
}
void dfs(int u,int fa)
{
siz[u]=1;
f[u][0][0]=f[u][0][1]=0;
for(int i=head[u];i;i=nx[i])
{
int v=to[i];
if(v==fa)
continue;
dfs(v,u);
for(int j=siz[u]-1;j>=0;--j)
for(int k=siz[v]-1;k>=0;--k)
for(int l=2;l>=0;--l)
for(int m=l;m>=0;--m)
upd(f[u][j+k+1][l],f[u][j][l-m]+f[v][k][m]+val[i]*(2-(m & 1)));
siz[u]+=siz[v];
}
}
int n,m;
int main()
{
n=read(),m=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read(),w=read();
add(u,v,w);
add(v,u,w);
}
memset(f,0x3f,sizeof f);
dfs(1,0);
int ans=0x7fffffff;
for(int i=1;i<=n;++i)
for(int j=0;j<=2;++j)
ans=min(ans,f[i][m-1][j]);
printf("%d\n",ans);
return 0;
}

参考了dalao的blog.

bzoj 4987 Tree的更多相关文章

  1. bzoj 4987 Tree —— 树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4987 其实就是在树上找有 k 个点的连通块(路径上的点都选是最优的),之间的边都走了两遍,只 ...

  2. bzoj 2212 Tree Rotations

    bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...

  3. bzoj 2631: tree 动态树+常数优化

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1716  Solved: 576[Submit][Status] Descrip ...

  4. [BZOJ - 2631] tree 【LCT】

    题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...

  5. [BZOJ 3282] Tree 【LCT】

    题目链接:BZOJ - 3282 题目分析 这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息. 写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x] ...

  6. BZOJ 2654: tree( 二分 + MST )

    我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...

  7. BZOJ 3282: Tree( LCT )

    LCT.. -------------------------------------------------------------------------------- #include<c ...

  8. BZOJ 2631: tree( LCT )

    LCT...略麻烦... -------------------------------------------------------------------------------- #inclu ...

  9. BZOJ 3282 Tree Link-Cut-Tree(LCT)

    题目大意: 给定N个点以及每一个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y ...

随机推荐

  1. HashMap的简单源码分析(看了大佬的源码,基于1.7) put方法

    参考博客: https://blog.csdn.net/eson_15/article/details/51158865 hashMap中的几个关键属性 //默认初始容量是16,必须是2的幂 stat ...

  2. samba 4.7.16 安装配置详解

    系统:Centos 7.4 x64位 服务版本:samba-4.7.1.samba-client-4.7 Samba 简介 Samba 是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服 ...

  3. Nginx 静态缓存

    静态文件缓存 静态缓存在客户端下进行缓存,可以设置缓存文件类型与缓存时间,提升客户端访问站点速度. 主要对图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图 ...

  4. ASP.NET MVC CheckBoxFor的int to bool

    当我们使用CheckBoxFor类型需要使用bool ,可以将 int转换成bool <div class="form-group"> <label class= ...

  5. J2EE--Hibernate基础笔记

    因为写的是基础内容,所以在这里,(映射集合.映射组件.复合主键和联合主键,jpa annotation,关联映射,hql等等实用内容)都不会提到- 这里写的就是试用李刚<J2EE实战>那本 ...

  6. APPIUM API整理(python)---操作类

    前言:android手机大家都很熟悉,操作有按键.触摸.点击.滑动等,各种操作方法可以通过api的方法来实现. 参考博文:http://blog.csdn.net/bear_w/article/det ...

  7. 砝码称重V2

    总时间限制:  1000ms 内存限制:  65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计算用这些砝码能称出的不同重量的个数 ...

  8. 使用buildroot创建自己的交叉编译工具链【转】

    本文转载自:https://blog.csdn.net/linczone/article/details/45894181 使用buildroot创建自己的交叉编译工具链 关键字:buildroot ...

  9. [POI2009]Lyz

    Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人 ...

  10. quartz(5)--作业管理和存储

    作业一旦被调度,调度器需要记住并且跟踪作业和它们的执行次数.如果你的作业是30分钟后或每30秒调用,这不是很有用.事实上,作业执行需要非常准确和即时调用在被调度作业上的execute()方法.Quar ...