求一棵n点树的k个点,使得任意两点距离和最小。

关键字:树形分组背包、换角度求和

原题要求求任意两点的距离之和,不易处理,因此我们可以从边的角度,计算每条边计算了多少次。一条边<u,v>可以将一棵树分为两部分,每部分有x,k-x个点,则该边被计算了2*x*(k-x)次。因此,该边的贡献是2*x*(k-x)*w<u,v>,若u是v的父亲,且已知v中x条边对整体的最小贡献,则可以通过分组背包模型解决该问题。dp[u][k][i]:u节点遍历到前m个孩子节点时,点容量为i的最小距离和。每个孩子可以占据1,2...i个点和贡献相应的距离。dp[u][m][i]={dp[u][m-1][i],dp[u][m-1][i-j]+(dp[v][j]+2*w<u,v>*(k-j)*j)}

完全背包模型:一共有n件物品,和容量为v的背包。第i件物品的容量是Ci,价值是Wi。背包被分为k组,每组至多选1件物品。求一种选择方案,使得物品总容量不超过背包容量,且价值最大。

状态转移方程:F [k; v] = max{ F [k - 1; v]; F [k - 1; v - Ci ] + Wi | item i ∈ group k}

伪代码:

for k  <—1 to K 枚举所有的组 (在树中即为每个子节点)
for v <— V to 0 枚举所有的容量 从大到小,保证每组仅有一个进入背包(在树中即为每个孩子仅进入一次)
for all item i in group k 每组选择一件物品(每个子节点进行一次选择)
F [v]  = max{ F [v], F [v - Ci ] + Wi }

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#define ll long long
#define sf scanf
#define pf printf
#define maxn 10000
#define inf 0x3f3f3f
#define INF 1ll<<60
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x&(-x)
using namespace std;int t,n,k;
struct Edge{int to,next;ll w;
}edge[maxn];
int head[maxn],tot;
ll dp[maxn][55];void add(int u,int v,ll w){edge[tot].to=v,edge[tot].next=head[u],edge[tot].w=w;head[u]=tot++;
}void init(){mem(head,-1);tot=0;for(int i=1;i<=n;i++)for(int j=0;j<=k;j++)dp[i][j]=(j==1||j==0)?0:INF;
}void dfs(int u,int fa){//树形分组背包dp[u][0]=dp[u][1]=0;for(int l=head[u];l!=-1;l=edge[l].next){//每个孩子 <=> 每个组int v=edge[l].to;ll w=edge[l].w;if(v==fa) continue;dfs(v,u);//1.递归求得每个孩子的最优值//2.对每个孩子进行完全背包for(int i=k;i>=1;i--){//容量for(int j=1;j<=i;j++){//枚举每组的物品ll cost=dp[v][j]+(ll)w*j*(k-j)*2;dp[u][i]=min(dp[u][i],dp[u][i-j]+cost);}}}
}int main(){//freopen("a.txt","r",stdin);scanf("%d",&t);while(t--){scanf("%d%d",&n,&k);init();for(int i=0;i<n-1;i++){int a,b;ll c;scanf("%d%d%lld",&a,&b,&c);add(a,b,c),add(b,a,c);}dfs(1,0);printf("%lld\n",dp[1][k]);}return 0;
}

bug:分组背包必须先枚举组,再枚举容量,不能先枚举容量!

long long的上限取1ll<<60即可

hdu5148 Cities相关推荐

  1. 1013 Battle Over Cities(并查集解法)

    关于背景的介绍见1013 Battle Over Cities(图的DFS解法) DFS就是不算特定结点后数连通子图的总数,再减一.我想着那么并查集就是数不算特定节点后,集合元素(根)的个数.但是我弄 ...

  2. R语言ggplot2进行特定国家或者地区的地图可视化、在地图上标出所有首府城市所在地(plot the locations of the capital cities)

    R语言ggplot2进行特定国家或者地区的地图可视化.在地图上标出所有首府城市所在地(plot the locations of the  capital cities) 目录

  3. HDU——2874 Connections between cities

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  4. Educational Codeforces Round 12 A. Buses Between Cities 水题

    A. Buses Between Cities 题目连接: http://www.codeforces.com/contest/665/problem/A Description Buses run ...

  5. CF449B Jzzhu and Cities 迪杰斯特拉最短路算法

    CF449B Jzzhu and Cities 其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^) AC代码: #include<bits/stdc++.h> #d ...

  6. Cities (思维 树)

    链接:https://ac.nowcoder.com/acm/contest/123/C 来源:牛客网 题目描述 There are  cities in Byteland, and the  cit ...

  7. PAT甲级1013 Battle Over Cities:[C++题解]并查集、结构体存边

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:并查集题目. 不清楚并查集的小伙伴,请移步并查集原理并查集板子:acwing836. 合并集合. 题意:给定一个连通图,当删掉任意1个 ...

  8. 【解析】1013 Battle Over Cities (25 分)_31行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 It is vitally important to have all the cities connected by highw ...

  9. Cities(2020昆明C)

    Cities(2020昆明C) 题意: 给定长度为n的序列a[],一次操作你可以选择一个数值相同的连续区间,将这个区间的数值修改为其他数. 问多少进行多少次操作能使得区间所有数相同. n<=50 ...

最新文章

  1. 用于点云视频时空建模的点4D transformer网络(CVPR 2021)
  2. mongodb的监控与性能优化
  3. vue-router基本使用
  4. Python Day18
  5. 【ABAP】销售订单Billing Plan创建
  6. CVS有关no such repository问题
  7. (19) 转载: 寻找丑数
  8. 视频 | OFC上的腾讯声音
  9. Database specific hint in One order search
  10. eclipse代码发布到服务器(Tomcat)出现乱码现象解决方法
  11. leetcode1415. 长度为 n 的开心字符串中字典序第 k 小的字符串(回溯)
  12. matlab中get和set命令,关于matlab中get和set的用法
  13. 静态变量的多线程同步问题
  14. JVM GC一篇通 - 基础与调优
  15. 点击按钮后网页不向上滚动
  16. 订单发货的存储过程mysql_一个订单相关的存储过程(MySQL)
  17. CSS3 圆形时钟式网页进度条
  18. java数独流程图_软件工程个人项目总结-数独
  19. Chrome笔试平台 摄像头无法开启 | 摄像头图像黑屏 问题解决
  20. 电信大数据治理与质量管理

热门文章

  1. modelsim破解
  2. Gradle 项目配置阿里云仓库
  3. MIPS微程序CPU设计
  4. Gravity 介绍
  5. Redis实现的布隆过滤器如何快速有效删除数据
  6. QT案例实战1 - 从零开始编写一个OCR工具软件 (6) 关于QThread线程的使用
  7. 苹果备忘录永久删除怎么恢复?分享2个找回备忘录的高效操作
  8. norflash/nandflash 启动分析 转
  9. HashMap遍历方法和实现原理分析
  10. Java JSON字符串格式解析,数组取值