题目: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. BZOJ——1610: [Usaco2008 Feb]Line连线游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1610 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 2 ...

  2. DFS与BFS对比

    前面已经说过了深搜和广搜了,是不是有点还不是很好的分清他们?(其实分不分的请都没大有关系) 下面我们来看一看广搜与深搜的区别吧. 算法步骤上的区别 深度优先遍历图算法步骤: 1.访问顶点v 2,.依次 ...

  3. P2007 魔方

    洛谷——P2007 魔方 题目背景 常神牛从来没接触过魔方,所以他要借助计算机来玩.即使是这样,他还是很菜. 题目描述 常神牛家的魔方都是3*3*3的三阶魔方,大家都见过. (更正:3 4以图为准.) ...

  4. Codeforces 961 E Tufurama

    Discription One day Polycarp decided to rewatch his absolute favourite episode of well-known TV seri ...

  5. Codeforces 375 D Tree and Queries

    Discription You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. ...

  6. PHP用CURL发送Content-type为application/json的HTTP/HTTPS请求

    <?php $headers = array( "Content-type: application/json;charset='utf-8'", "Accept: ...

  7. 邁向IT專家成功之路的三十則鐵律 鐵律一:IT人生存之道-柔

    老子在道德經裡頭曾提到:「天下之至柔,馳聘天下之至堅」,又說:「堅強者死之徒,柔弱者生之徒」.其實人在面對世間的萬事萬物都是一樣的,只是當我們學習將這個至理套用在IT的工作職場時,將可以讓我們在這條崎 ...

  8. 【转】Spring框架深入理解

    参考这篇文章: http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/ Spring内部分为Beans, Context 和 ...

  9. 【Todo】一些scala的实验 & 与Java的混合

    另外,如果要支持 java 和 scala混合build,可以看看这篇文章: http://www.cnblogs.com/yjmyzz/p/4694219.html Scala和Java实现Word ...

  10. SolidEdge如何修改线型和线宽

    选中一条直线,然后点击如下所示两个按钮,可以分别修改线型和线宽.