Description

从前有棵树。

找出K个点A1,A2,…,Ak。

使得∑dis(AiAi+1),(1<=i<=K-1)最小。

Input

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

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

I<=k<=n。

l<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

Sol

首先显然这些点是树中的一个联通子块。这个联通子块也是一棵树,而这个联通子块内最优的安排顺序就是让直径只走一遍,其他的边都走两遍。所以我们的treedp是需要围绕直径展开的。我们不妨枚举一个子树内包含了多少个直径上的端点(0,1,2),然后树形背包合并。

设\(f[i][j][k]\)表示以i为根的子树中,有j个选定的点,这些点中直径的端点有k个。那么在合并答案的时候,如果子节点子树的\(k=0\),那么说明子节点子树内的边全都不是直径,所以当前根节点到这个子节点的边长就要经过两次;如果子节点子树的\(k=1\),那么说明子节点子树内有直径的一部分,所以当前根节点到这个子节点的边长也是直径,只用经过一次;如果\(k=2\),那么说明整个直径都在子节点子树内,所以当前根节点到这个子节点的边长需要经过两次。之后我们只需要枚举子树中关键点的个数,枚举两个子树中的k,再加上当前这条边的贡献,就能够完成转移了。

$f[x][a+b+1][c]=min(f[x][a+b+1][c],f[x][a][c-d]+f[to[i]][b][d]+len[i]*(2-(d&1))); $

其中a,b枚举的是子节点关键点的点数,c表示根节点的k,d表示子节点的k,转移的时候枚举这些变量即可。

Code

#include <bits/stdc++.h>
using namespace std;
int hed[3005],to[6005],len[6005],nex[6005],cnt,siz[3005],f[3005][3005][3],n,m,x,y,z,ans=2147483647;
void add(int x,int y,int z){to[++cnt]=y,len[cnt]=z,nex[cnt]=hed[x],hed[x]=cnt;}
void dfs(int x,int fa)
{
siz[x]=1,f[x][0][0]=f[x][0][1]=0;
for(int i=hed[x];i;i=nex[i]) if(to[i]!=fa)
{
dfs(to[i],x);
for(int a=siz[x]-1;~a;a--) for(int b=siz[to[i]]-1;~b;b--) for(int c=2;~c;c--) for(int d=c;~d;d--)
f[x][a+b+1][c]=min(f[x][a+b+1][c],f[x][a][c-d]+f[to[i]][b][d]+len[i]*(2-(d&1)));
siz[x]+=siz[to[i]];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++) scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
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][m-1][j]);
printf("%d\n",ans);
}

【bzoj4987】Tree 树形dp的更多相关文章

  1. BZOJ4987:Tree(树形DP)

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

  2. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  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. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  5. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  6. hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

    /** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...

  7. 5.10 省选模拟赛 tree 树形dp 逆元

    LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...

  8. Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】

    题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...

  9. codeforces Round #263(div2) D. Appleman and Tree 树形dp

    题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...

  10. POJ 2486 Apple Tree(树形DP)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

随机推荐

  1. Libevent使用例子,从简单到复杂

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39670221 本文从简单到复杂,展示如何使用libevent.网上的许多例子都是只有服务 ...

  2. 12-EasyNetQ之消息版本控制

    为了能够支持消息版本控制,你需要确保这个必要的组件已配置.最简单的实现是这样的: var bus = RabbitHutch.CreateBus("host=localhost", ...

  3. 幂等性的含义和 HTTP请求方法的幂等性

    幂等性的含义和 HTTP请求方法的幂等性 1.什么是幂等性 =============== 幂等性,英文是idempotent,读作[aɪ'dɛmpətənt]. 它的含义如下: “Methods c ...

  4. java Web jsp和servlet的关系

    JSP在本质上就是SERVLET,但是两者的创建方式不一样Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观JSP由HTML代码和JSP标签构 ...

  5. 【poj1679】The Unique MST

    [题目大意] 共T组数据,对于每组数据,给你一个n个点,m条边的图,设图的最小生成树为MST,次小生成树为ans,若MST=ans,输出Not Unique!,否则输出MST [题解] 很明确,先求M ...

  6. c++ 组合模式(composite)

    原文地址:http://www.cnblogs.com/jiese/p/3168844.html 当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用 ...

  7. https://github.com/ildoonet/tf-pose-estimation

    https://github.com/ildoonet/tf-pose-estimation

  8. django: rest-framework的 分页和过滤

    django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...

  9. python,itertools模块

    itertools模块的使用: # coding=utf-8 """ itertools模块 """ import itertools im ...

  10. 2.8.3 并发下诡异的HashMap

    package 第二章.并发下诡异的HashMap; import org.junit.Test; import java.util.HashMap;import java.util.Map;impo ...