题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4987

其实就是在树上找有 k 个点的连通块(路径上的点都选是最优的),之间的边都走了两遍,只有一条路径(a[1] -> a[k])走了一遍;

于是 f[x][j][0/1/2] 表示以 x 为根的子树内选了 k 个点,有 0/1/2 个端点(路径结尾)的最小值;

但是为什么转移必须是推过去而不能是加回来?TLE...?真是太奇怪了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=,inf=1e9;
int n,m,hd[xn],ct,to[xn<<],nxt[xn<<],w[xn<<],f[xn][xn][],siz[xn],ans;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; w[ct]=z; hd[x]=ct;}
void dfs(int x,int fa)
{
siz[x]=;
f[x][][]=f[x][][]=;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
dfs(u,x);
for(int j=siz[x];j>=;j--)
for(int k=siz[u];k>=;k--)
{
f[x][j+k][]=min(f[x][j+k][],f[x][j][]+f[u][k][]+(w[i]<<));
f[x][j+k][]=min(f[x][j+k][],min(f[x][j][]+f[u][k][]+(w[i]<<),f[x][j][]+f[u][k][]+w[i]));
f[x][j+k][]=min(f[x][j+k][],f[x][j][]+f[u][k][]+w[i]);
f[x][j+k][]=min(f[x][j+k][],min(f[x][j][]+f[u][k][]+(w[i]<<),f[x][j][]+f[u][k][]+(w[i]<<)));
}
// for(int j=min(m,siz[x]+siz[u]);j>=2;j--) //--TLE???
// for(int k=1;k<=min(j-1,siz[u]);k++)//j-1
// {
// f[x][j][0]=min(f[x][j][0],f[x][j-k][0]+f[u][k][0]+(w[i]<<1));
// f[x][j][1]=min(f[x][j][1],min(f[x][j-k][1]+f[u][k][0]+(w[i]<<1),f[x][j-k][0]+f[u][k][1]+w[i]));
// f[x][j][2]=min(f[x][j][2],f[x][j-k][1]+f[u][k][1]+w[i]);
// f[x][j][2]=min(f[x][j][2],min(f[x][j-k][0]+f[u][k][2]+(w[i]<<1),f[x][j-k][2]+f[u][k][0]+(w[i]<<1)));//!
// }
siz[x]+=siz[u];
}
for(int i=;i<=;i++)ans=min(ans,f[x][m][i]);//
}
int main()
{
n=rd(); m=rd();
for(int i=,x,y,z;i<n;i++)
{
x=rd(); y=rd(); z=rd();
add(x,y,z); add(y,x,z);
}
memset(f,0x3f,sizeof f); ans=inf;
dfs(,);
printf("%d\n",ans);
return ;
}

bzoj 4987 Tree —— 树形DP的更多相关文章

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

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

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

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(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为根的树 ...

随机推荐

  1. Spring的Bean定义

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-definition.html: Bean定义 被称作bean的对象是构成应用程序的支柱也 ...

  2. 50 个 Bootstrap 插件

    Bootstrap是快速开发Web应用程序的前端工具包.它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的版式,表单,buttons,表格,网格系统等等. 本文向你 ...

  3. 【Todo】Java8新特性学习

    参考这篇文章吧: http://blog.csdn.net/vchen_hao/article/details/53301073  还有一个系列

  4. 【paddle学习】词向量

    http://spaces.ac.cn/archives/4122/   关于词向量讲的很好 上边的形式表明,这是一个以2x6的one hot矩阵的为输入.中间层节点数为3的全连接神经网络层,但你看右 ...

  5. window7_64安装STAF

    1.       安装包下载 从http://sourceforge.net/projects/staf/files/staf/V3.4.17/下载所需安装包,有Windows.Linux.Solar ...

  6. BeagleBone Black Industrial 进阶设置(性能优化以及延长板载eMMC存储寿命)

    前言 原创文章,转载引用务必注明链接.水平有限,欢迎指正. 本文使用markdown写成,为获得更好的阅读体验,推荐访问我的博客原文: http://www.omoikane.cn/2016/09/1 ...

  7. 吃我一记咸鱼突刺——使用板载RTC定时开机

    前言 原创文章,转载引用务必注明链接.水平有限,欢迎指正. 2016年3月30日 Lemuntu(Base On Jessie) 3.10.37 原载于Lemaker论坛.汇总于此. 看ATC2603 ...

  8. 简谈Java的join()方法(转)

    join()是Thread类的一个方法.根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this ...

  9. Desktop Management Interface & System Management BIOS

    http://en.wikipedia.org/wiki/Desktop_Management_Interface Desktop Management Interface From Wikipedi ...

  10. 基于SpringMVC框架使用ECharts3.0实现堆叠条形图的绘制(下篇)

    <script type="text/javascript"> $().ready(function() { var myChart = echarts.init(do ...