hdu 5148 City (树形dp)
题意:
在树中取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)相关推荐
- HDU 5148 Cities (树形DP)*
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5148 #include<bits/stdc++.h> using namespace st ...
- hdu 5148 Cities(树形dp)
题目链接:hdu 5148 Cities dp[i][j]表示以i为根节点,选j个最优值,每条边被选中的时候就计算出被经过的次数,并乘上权值. #include <cstdio> #inc ...
- HDU 5148 Cities 树形DP(背包)
HDU 5148 题意;n个点的树,第i条边长度为c[i],任意选中k个点为特殊点,这k个点中,任意两点间距离的期望值最小为多少? n<=2000,k<=min(50,n) c[i]< ...
- hdu 5148 cities 树形DP
*******************************bestcoder题解********************************Cities 选出K个点v1,v2,...vK使得∑ ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- HDU Starship Troopers (树形DP)
Starship Troopers Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) ...
- hdu 2196(经典树形dp)
题意:给你一颗边带权值的树,求树上的每一点距离其最远的一个点的距离 解题思路:这道题网上说是经典的树形dp,不过确实很巧妙.两次dfs应该是比较好想到的,因为某节点最大的距离要么就是一直走到叶子节点, ...
- HDU - 4705 Y(树形dp)
题目链接:点击查看 题目大意:给出一棵树,求三个点不在一条线上的个数 题目分析:正难取反,正着求不管是暴力还是有点技巧都是实现不了的,我们可以求出来三个点在一条直线上的方案数,然后用总的排列组合的方案 ...
- HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)
题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...
最新文章
- Apache无法启动解决 the requested operation has failed
- Android WebView与js交互通信
- c++ builder 使用indy http调用webservice方法
- python编写数学公式大全_python - 用python编写数学公式 - 堆栈内存溢出
- ccna____总结
- C#——《C#语言程序设计》实验报告——泛型与集合——运算符重载
- [ZJOI2007]棋盘制作
- Windows7 beta1 微软官方下载
- 科技的趋势!AI将进军了37%的企业
- 关于我自己的三个层次
- 少儿编程100讲轻松学python(十一)-python如何保留小数点位数
- 介词for和with 和of的用法_英语中的for,to,at,of,in,on,with的用法
- MIUI Android p手势,小米8 Android P内测9月开启
- git学习笔记-(3-linux基本命令)
- 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客
- archive.php 不起作用,PHP ZipArchive在Laravel中不起作用
- 教你如何在短期内做好会员运营快速拉新用户
- 高德地图开发 —— 获取高德地图开发的 key
- 1003: 两个整数的四则运算 Python
- ❤️Java中经纬度换算❤️