题目: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 ;
}

最新文章

  1. mongoDB研究笔记:复制集故障转移机制
  2. 玩转React样式
  3. 10年程序员谈.Net程序员的职业规划(图/文) (转载)
  4. flask开发遇到Internal Server Error的解决办法
  5. iOS-label出现未知边框线的bug
  6. HDU_2553——n皇后问题,作弊
  7. VMWare 虚拟化 Ubuntu 64 (16.04)-- docker 无法链接 pull 镜像 ?(solved)
  8. [JSOI2008]Blue Mary开公司
  9. 编译GDAL使用最新的HDF库配置文件
  10. Android开源系列:仿网易Tab分类排序控件实现
  11. vue init webpack nameXXX 报错问题:
  12. PopupWindows 在2.3.3下报java.lang.NullPointerException
  13. luogu1941 [NOIp2014]飞扬的小鸟 (dp)
  14. ACM数论之旅3---最大公约数gcd和最小公倍数lcm(苦海无边,回头是岸( ̄∀ ̄))
  15. 模仿Masonary写一个计算器
  16. Servlet.service() for servlet UserServlet threw exception java.lang.NullPointerException 空指针异常
  17. Java复习第二天
  18. 洛谷 P1561 [USACO12JAN]爬山Mountain Climbing
  19. win32 读取文本文件,并进行字符串分割和存储
  20. chef简介

热门文章

  1. Neo4j 第七篇:模式(Pattern)
  2. 利用广播调用后台服务方法并根据方法返回的内容更新UI
  3. ftrace 详解
  4. JAVA获取前一个月的第一天和最后一天
  5. MBProgressHUD 显示方向异常
  6. iOS开发之计算两个日期的时间间隔
  7. linux的主分区与逻辑分区的关系
  8. C#json数据的序列化和反序列化(将数据转换为对象或对象集合)
  9. Computer form factor
  10. 龙书D3D11章节习题答案(第四章)