【银川网络赛G】Factories
题目大意:给定一棵 N 个节点的树,边有边权,选定 M 个叶子节点,使得任意两个叶子节点的树上距离之和最小,求最小值是多少。
题解:任意两点的树上距离和问题应从边的贡献角度考虑。
设 \(f[u][i]\) 表示以 u 为根的子树中,选了 i 个叶子节点的最优解,状态转移方程为:
\]
其中所加项为子节点和父节点之间的边的贡献。
代码如下
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
int T, kase = 0;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d %d", &n, &m);
vector<vector<pair<int, LL>>> adj(n + 1); // <to, w>
vector<int> deg(n + 1);
for (int i = 1; i < n; i++) {
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
adj[x].emplace_back(y, z);
adj[y].emplace_back(x, z);
++deg[x], ++deg[y];
}
if (m == 1) {
printf("Case #%d: 0\n", ++kase);
continue;
}
if (n == 2) {
printf("Case #%d: %lld\n", ++kase, adj[1][0].second);
continue;
}
vector<vector<LL>> f(n + 1, vector<LL>(m + 1, 1e12));
function<int(int, int)> dfs = [&](int u, int fa) -> int {
bool not_leaf = 0;
int sz = 0;
f[u][0] = 0;
for (auto t : adj[u]) {
int v = t.first;
LL w = t.second;
if (v == fa) {
continue;
}
not_leaf = 1;
int son = dfs(v, u);
for (int i = min(sz, m); i >= 0; i--) {
for (int j = min(son, m - i); j >= 0; j--) {
if (i + j > m) {
continue;
}
f[u][i + j] = min(f[u][i + j], f[u][i] + f[v][j] + (LL)j * (m - j) * w);
}
}
sz += son;
}
if (not_leaf == 0) {
f[u][1] = 0;
sz = 1;
}
return sz;
};
int rt = 0;
for (int i = 1; i <= n; i++) {
if (deg[i] > 1) {
rt = i;
break;
}
}
dfs(rt, 0);
printf("Case #%d: %lld\n", ++kase, f[rt][m]);
}
return 0;
}
【银川网络赛G】Factories的更多相关文章
- 2019南昌网络赛G. tsy's number
题意:\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\frac{\phi(i)*\phi(j^2)*\phi(k^3)}{\phi(i)*\phi(j)*\phi(k)} ...
- 【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle
题意:给你三个半径相同的圆,它们切在一起,然后让你往缝里一个一个地塞圆,问你塞到第k个的半径是多少. 就把上面那两个圆的切点当成反演中心,然后会反演成这个样子,两个平行直线和一个圆. 然后就是往那个圆 ...
- 2015北京网络赛 G Boxes BFS+打表
G Boxes 题意:n个位置摆有n个箱子,每次移动只能把相邻的垒起来,且上面的必须小于下面的.求摆成升序需要移动多少步. 思路:这里的n很小,只有7.但是bfs最快的情况需要2s左右,所以就打表了. ...
- 2018 ACM-ICPC徐州站网络赛 G题
There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xxx , yy ...
- 2019icpc银川网络赛
外面吵得风生水起,我校平静地在打比赛,丝毫不知道这次比赛的题目就是把2018银川邀请赛的题照搬过来了QAQ,主办方真牛逼.. A Maximum(思维) 题意:维护一个栈,支持入栈和出栈操作,并计算每 ...
- hihocode 1584 : Bounce (找规律)(2017 北京网络赛G)
题目链接 比赛时随便找了个规律,然后队友过了.不过那个规律具体细节还挺烦的.刚刚偶然看到Q巨在群里提到的他的一个思路,妙啊,很好理解,而且公式写起来也容易.OrzQ巨 #include<bits ...
- 2013 acm 长沙网络赛 G题 素数+枚举 Goldbach
题目 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3856 先预处理求出两个素数的和与积,然后枚举n-prime和n/pr ...
- hdu 4046 2011北京赛区网络赛G 线段树 ***
还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来 若某位是1,则前两个为wb,这位就是w #include<cstdio> #include<cstring> #defi ...
- hdu 4027 2011上海赛区网络赛G 线段树 成段平方根 ***
不能直接使用成段增减的那种,因为一段和的平方根不等于平方根的和,直接记录是否为1,是1就不需要更新了 #include<cstdio> #include<iostream> # ...
随机推荐
- 关于DOM操作的案例
1. 模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE html> < ...
- 【JulyEdu-Python基础】第 6 课:高级面向对象
使用@property添加属性和自定义属性 __slots__和property 方法和属性的动态绑定 使用__slots__限定class实例能添加的属性 __slots__仅对当前类实例起作用,对 ...
- 浅谈Angularjs至Angular2后内置指令的变化
一.科普概要说明 我们常说的 Angular 1 是指 AngularJS: 从Angular 2 开始已经改名了.不再带有JS,只是单纯的 Angular: Angular 1.x 是基于JavaS ...
- 菜鸟系列k8s——k8s快速入门(1)
k8s快速入门 1.快速创建k8s集群 参考网站:https://kubernetes.io/docs/tutorials/kubernetes-basics 点击教程菜单 1. Create a C ...
- Linux下面查看网卡的信息
查看linux下面网卡的速度信息 Study From 百度知道 (懒得翻墙) 1. centos机器 安装的比较全(个人比较懒 没有使用core最小化安装, 避免出问题麻烦 公司网络太垃圾) 使用 ...
- PHP中的接口
对象接口 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容. 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方 ...
- Charlie's Change POJ - 1787
Time limit 1000 ms Memory limit 30000 kB description Charlie is a driver of Advanced Cargo Movement, ...
- 解决WordPress百度分享图标不显示问题
最近在帮朋友维护博客时,发现他的百度分享居然不能使用了,首先很多人会认为,百度分享挂在那里就是一种摆设,又没有几个人去分享,有什么含义呢?其实挂百度分享的含义是非常重要的,网站增加一个百度分享是可以增 ...
- python-连接mysql实例
import pymysql # 创建连接 conn = pymysql.connect(host='192.168.71.140', port=3306, user='root', passwd=' ...
- QThread::wait(),一直以来我以为它阻塞的是QThread对象,可是我现在明白,原来阻塞的是这个对象所在的线程(通常是主线程)——所有事情源于 QThread 的事件循环——如果使用继承QThread这一方法,QThread::quit()没有效果,因为这个线程根本就不需要事件循环
近日,使用QThread,一些问题百思不得其解,看过大牛的文章,恍然大悟啊. 原文 http://hi.baidu.com/dbzhang800/item/c14c97dd15318d17e1f46f ...