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. ubuntu 16.04安装navicat for mysql

    下载地址:官网https://www.navicat.com/download 1.下载 navicat120_mysql_en_x64.tar.gz 文件  2.下载后移到/opt/下 3.解压ta ...

  2. linux命令详解之(at)

    在Linux下,有两个命令可以用来作为计划任务而执行,at:一次性定时任务计划执行crontab :每天定时任务计划执行 以下仅说一下一次性任务计划执行(at)要使用一次性任务计划,linux必须要有 ...

  3. Microsoft.VisualStudio.Web.PageInspector.Loader

    未能加载文件或程序集"Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, P ...

  4. 使用Angularjs开发Web App 视频课程 --麦子学院课程

    前往搓这里: http://www.maiziedu.com/group/common/course/3271/ 查看课程搓这里:http://www.maiziedu.com/course/web/ ...

  5. jQuery可自动播放动画的焦点图

    在线演示 本地下载

  6. Oracle函数如何把符串装换为小写的格式

    我们都知道Oracle函数在实际的应用中比较广泛,对其的实际操作与其相关功能也是颇为熟悉,但是你了解Oracle函数怎样使将字符串装换为小写的格式的具体操作吗?如果你有兴趣的话你就可以浏览以下的文章. ...

  7. Cisco交换机设备配置镜像端口

    查看交换机端口的基本情况,输入命令 show ip int bri,可以查看端口状态 FastEthernet表示百兆以太网端口,GigabitEthernet表示千兆以太网端口. 进入全局模式 设置 ...

  8. style、 currentStyle、 runtimeStyle、getComputedStyle区别分析

    1.obj.style只能获得内嵌样式(inline Style)就是写在Tag里面的,他访问不到那些链接的外部css和在head中用<style>声明的style. 所以必须认识到在那些 ...

  9. linux 挂在新硬盘

    记录一下    全忘了..... PS 测试服务器的主板太差劲了,没有多余的电源接口,只能把光驱的电源拿出来,才能让硬盘使用.把硬盘装好后,我们用 fdisk -l 查看下: 图中可以看出 /dev/ ...

  10. 编译lineageos

    lineageos 2 -- 编译rom包 fu*k小米,手机老是1年左右出现充不进去电.前段时间我的红米note4x突然充不进去电了,只好新买了个手机(买手机先看lineageos支持列表 ^_^) ...