题意:很久很久以前,有一个叫做杰哥的骑士. 他生活在一个小王国里. 这个王国由n座城市组成,这n座城市通过n-1条道路相连(意味着这个王国是一棵树结构). 由于杰哥打倒了大魔王,并且从魔王手中救出了公主,国王决定奖励他. 国王决定把公主嫁给杰哥,并且送出恰好K座城市,作为公主的嫁妆.
那么问题来了. 杰哥在和大魔王对♂战的时候,膝盖中了一剑,因此杰哥希望他的K座城市离得越近越好. 这就是说,杰哥希望他的K座城市的期望距离越小越好.
期望距离是这样定义的:首先,从杰哥的K座城市中随机选出一个点u,然后,再从杰哥的K座城市中随机选出一个点v,期望距离就是所有这样u和v的距离的平均值.(注意u可以等于v,此时u和v的距离为0).
请你决定这K座城市,使得杰哥尽量高兴.
你只需要输出最小的期望距离.

dp,dp[ i ][ j ]表示以 i 为根的子树内选择 j 个点后这个子树中的边贡献的值。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 2300
#define  ll long long
const long long inf = 200000 * 10000000LL;
int n,k;
ll dp[maxn][120];
ll tmp[120];
struct edge
{int u,v,w,next;
}e[maxn*10];
int head[maxn],cnt;
void add(int u,int v,int w)
{e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;e[cnt].next=head[u];head[u]=cnt++;
}
void dfs(int u,int fa)
{for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].v;if(v==fa) continue;dfs(v,u);for(int j=0;j<=k;j++) tmp[j]=dp[u][j];for(int j=0;j<=k;j++)for(int t=0;t<=j;t++)tmp[j]=min(tmp[j],dp[u][j-t]+dp[v][t]+(k-t)*t*e[i].w*2);for(int j=0;j<=k;j++) dp[u][j]=tmp[j];}
}
int main()
{int cas;scanf("%d",&cas);while(cas--){memset(head,-1,sizeof(head));cnt=0;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)for(int j=0;j<=k;j++){if(j<=1) dp[i][j]=0;else dp[i][j]=inf;}for(int i=1;i<n;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}dfs(1,-1);printf("%I64d\n",dp[1][k]);}return 0;
}

hdu 5148 Cities dp相关推荐

  1. hdu 5148 Cities(树形dp)

    题目链接:hdu 5148 Cities dp[i][j]表示以i为根节点,选j个最优值,每条边被选中的时候就计算出被经过的次数,并乘上权值. #include <cstdio> #inc ...

  2. HDU 5148 Cities 树形DP(背包)

    HDU 5148 题意;n个点的树,第i条边长度为c[i],任意选中k个点为特殊点,这k个点中,任意两点间距离的期望值最小为多少? n<=2000,k<=min(50,n) c[i]< ...

  3. HDU 5148 Cities (树形DP)*

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5148 #include<bits/stdc++.h> using namespace st ...

  4. hdu 5148 cities 树形DP

    *******************************bestcoder题解********************************Cities 选出K个点v1,v2,...vK使得∑ ...

  5. HDU 5148 Cities

    题目分析 非常好的一道题,这道题同样是求树上的期望问题,也就是每个边被使用的次数乘以 每个边的权值,再除以K*K/2(因为这道题可能会抽到相同的点)因为最后还需要乘以K*K那么这样一化简很明显就是最终 ...

  6. hdu 5148 树形dp,分组背包

    题目: 题目分析: 状态方程: dp[当前节点的标号][当前已经选取的城市数] 设已经选取的城市数是K 初始状态: dp[u][0] = dp[u][1] = 0 , 其他的将值设置为无穷大 树形转移 ...

  7. hdu 5148 Cities(树形背包)

    题意: 给出一棵树,现在要选择k个点,要求这个k个点组成的路的平均值(即期望)要最小,路径的综合可以这样计算 : ∑Ki∑Kj dis(vi,vj) 题解: 题目要求输出的是结果乘以k^2,那么这样就 ...

  8. hdu 5148 City (树形dp)

    题意: 在树中取k个点,这些点中任意点的距离和要最小. 题解: dp[i][j],表示以i为跟的子树选择j个节点对应的距离对整体的贡献,就是一个树形背包. dp[u][j] = min { dp[u] ...

  9. 【树形DP】 HDOJ 5148 Cities

    对于每个节点枚举子节点即可... #include <iostream> #include <queue> #include <stack> #include &l ...

最新文章

  1. html 显示消息数量,html实现消息按钮上的数量角标的实例详解
  2. 胡玮炜卸任摩拜CEO,或将成为美团大裁员的开端
  3. android svn丢失文件恢复,SVN搭建(以此为准,成功)文后含备份与恢复
  4. java中有关类的程序设计_《Java程序设计一》 1,设计课程类及类中包含的属性和方法....
  5. 《大话设计模式》笔记(1)——创建型模式
  6. c++ 读文件_python中文件的使用
  7. 浅谈Vue 中的 computed 和 methods 的使用
  8. sprintf()出错,使用strcat()正确
  9. IntelliJ IDEA教程
  10. c#调用microsoft word将word另存为pdf
  11. 我的Java传承名单(不知为何以前的又没有了,幸亏有备份才可以又贴出来)
  12. 如何用acme.sh申请证书
  13. 用于退出access的宏命令是_宏操作QuitAccess的功能是什么
  14. 联想笔记本大小写、数字键、触摸板切换图标不显示的解决方案
  15. b区机械考研哪些院校比较好考?
  16. 内容管理系统CMS简介
  17. java生成大小写字母加数字的随机数
  18. SVG代码例子及含义
  19. 脏读、幻读、不可重复读,傻傻分不清楚
  20. CSharp和.net的简单介绍

热门文章

  1. 19、基于STM32的电子打铃器
  2. 电影《妖妖铃》改名为《妖铃铃》
  3. 电磁场与电磁波实验 02 - | 电磁波波长测试实验
  4. golang学习笔记(进阶篇)
  5. Vultr 教程目录
  6. Java生成条形码图片到本地
  7. html5制作坦克大战
  8. 《Linux 驱动:输入子系统》
  9. 如何包装你的实验结果
  10. 还在为网速烦恼?你可能没有使用华为云CDN加速服务