题意:

在树中取k个点,这些点中任意点的距离和要最小。

题解:

dp[i][j],表示以i为跟的子树选择j个节点对应的距离对整体的贡献,就是一个树形背包。

dp[u][j] = min { dp[u][j-t] + dp[v][t] + cost(t * (k-t) * w * 2) } cost是连接u和v的边对整体的贡献。

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#define B(x) (1<<(x))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned ui;
const int oo = 0x3f3f3f3f;
//const ll OO = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-9;
#define lson rt<<1
#define rson rt<<1|1
void cmax(int& a, int b){ if (b > a)a = b; }
void cmin(int& a, int b){ if (b < a)a = b; }
void cmax(ll& a, ll b){ if (b > a)a = b; }
void cmin(ll& a, ll b){ if (b < a)a = b; }
void cmax(double& a, double b){ if (a - b < eps) a = b; }
void cmin(double& a, double b){ if (b - a < eps) a = b; }
void add(int& a, int b, int mod){ a = (a + b) % mod; }
void add(ll& a, ll b, ll mod){ a = (a + b) % mod; }
const ll MOD = 1000000007;
const int maxn = 2100;
struct EDGE{int v, w, next;
}E[maxn << 1];
int head[maxn], tol;
ll dp[maxn][maxn];
int n, k;void Init(){memset(head, -1, sizeof head);tol = 0;
}void add_edge(int u, int v, int w){E[tol].v = v;E[tol].w = w;E[tol].next = head[u];head[u] = tol++;
}void tree_dp(int u, int pre){for (int i = 2; i <= k; i++)dp[u][i] = oo;dp[u][0] = dp[u][1] = 0;int f = 0;for (int i = head[u]; i != -1; i = E[i].next){int v = E[i].v;if (v == pre) continue;f = 1;tree_dp(v, u);for (int j = k; j >= 0; j--){for (int t = 1; t <= j; t++)cmin(dp[u][j], dp[u][j - t] + dp[v][t] + E[i].w * t * (k - t) * 2);}}
}int main(){int u, v, w, T;scanf("%d", &T);while (T--){scanf("%d %d", &n, &k);Init();for (int i = 1; i < n; i++){scanf("%d %d %d", &u, &v, &w);add_edge(u, v, w);add_edge(v, u, w);}tree_dp(1, -1);cout << dp[1][k] << endl;}return 0;
}
/*
1
2 2
1 2 1
*/

hdu 5148 City (树形dp)相关推荐

  1. HDU 5148 Cities (树形DP)*

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

  2. hdu 5148 Cities(树形dp)

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

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

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

  4. hdu 5148 cities 树形DP

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

  5. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  6. HDU Starship Troopers (树形DP)

    Starship Troopers Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

  7. hdu 2196(经典树形dp)

    题意:给你一颗边带权值的树,求树上的每一点距离其最远的一个点的距离 解题思路:这道题网上说是经典的树形dp,不过确实很巧妙.两次dfs应该是比较好想到的,因为某节点最大的距离要么就是一直走到叶子节点, ...

  8. HDU - 4705 Y(树形dp)

    题目链接:点击查看 题目大意:给出一棵树,求三个点不在一条线上的个数 题目分析:正难取反,正着求不管是暴力还是有点技巧都是实现不了的,我们可以求出来三个点在一条直线上的方案数,然后用总的排列组合的方案 ...

  9. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

最新文章

  1. Apache无法启动解决 the requested operation has failed
  2. Android WebView与js交互通信
  3. c++ builder 使用indy http调用webservice方法
  4. python编写数学公式大全_python - 用python编写数学公式 - 堆栈内存溢出
  5. ccna____总结
  6. C#——《C#语言程序设计》实验报告——泛型与集合——运算符重载
  7. [ZJOI2007]棋盘制作
  8. Windows7 beta1 微软官方下载
  9. 科技的趋势!AI将进军了37%的企业
  10. 关于我自己的三个层次
  11. 少儿编程100讲轻松学python(十一)-python如何保留小数点位数
  12. 介词for和with 和of的用法_英语中的for,to,at,of,in,on,with的用法
  13. MIUI Android p手势,小米8 Android P内测9月开启
  14. git学习笔记-(3-linux基本命令)
  15. 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客
  16. archive.php 不起作用,PHP ZipArchive在Laravel中不起作用
  17. 教你如何在短期内做好会员运营快速拉新用户
  18. 高德地图开发 —— 获取高德地图开发的 key
  19. 1003: 两个整数的四则运算 Python
  20. ❤️Java中经纬度换算❤️

热门文章

  1. Jetsonnano的环境配置--ros环境
  2. 浅谈二叉搜索树(BST)
  3. 清空Redis集群数据工具
  4. 面试必练:50道经典SQL练习
  5. Web学习(二)CSS
  6. Redis管道技术的使用
  7. HTTP和HTTPS、HTTP返回码
  8. html坦克游戏,HTML5制作的坦克游戏
  9. 腾讯受邀参加2019世界移动通信大会5G论坛,分享5G技术探索
  10. CommonJs和Es Module的区别