[xsy2724]Tree
题意:给一棵树,找出$k$个点$A_{1\cdots k}$以最小化$\begin{align*}\sum\limits_{i=1}^{k-1}dis_{A_i,A_{i+1}}\end{align*}$
当$k=n$时,除了$A_1\rightarrow A_k$路径上的边,其他边都被经过两次,所以答案就是边权和的两倍减去直径长度
所以我们这样设计状态:$g_{i,j}$表示在$i$的子树内选了$j$个点(包括$i$)构成的树的(边权和的两倍)的最小值,$f0_{i,j}$表示在$i$的子树内选了$j$个点,并且这$j$个点构成的树的直径有一端是$i$,构成的树的(边权和的两倍减去直径长度)的最小值,$f1_{i,j}$表示在$i$的子树内选了$j$个点,并且这$j$个点构成的树的直径两端都不是$i$,构成的树的(边权和的两倍减去直径长度)的最小值,容易得到转移(假设$y$是$x$的儿子)
$g_{x,j+k}\leftarrow g_{x,j}+g_{y,k}+2w_{x,y}$
$f0_{x,j+k}\leftarrow f0_{x,j}+g_{y,k}+2w_{x,y}$(直径不变)
$f0_{x,j+k}\leftarrow g_{x,j}+f0_{y,k}+w_{x,y}$(直径变为从$y$过来)
$f1_{x,j+k}\leftarrow g_{x,j}+f1_{y,k}+2w_{x,y}$(直径变为从$y$来,不经过$x$)
$f1_{x,j+k}\leftarrow f0_{x,j}+f0_{y,k}+w_{x,y}$(直径变为从$y$来,经过$x$)
$f1_{x,j+k}\leftarrow f1_{x,j}+g_{y,k}+2w_{x,y}$(直径不变)
总的计算次数是$\begin{align*}\sum\limits_{fa_i=fa_j}size_isize_j\end{align*}$,注意到$\begin{align*}\sum\limits_{fa_i=fa_j=x}size_isize_j\end{align*}$统计的是$lca_{i,j}=x$的对数,对所有$x$求和就是统计点对,所以总时间复杂度是$O\left(n^2\right)$
#include<stdio.h>
const int inf=1000000000;
int h[3010],nex[6010],to[6010],w[6010],siz[3010],g[3010][3010],f0[3010][3010],f1[3010][3010],M;
void add(int a,int b,int c){
M++;
to[M]=b;
w[M]=c;
nex[M]=h[a];
h[a]=M;
}
void min(int&a,int b){
if(b<a)a=b;
}
void dfs(int fa,int x){
int i,j,k,s;
siz[x]=1;
for(i=h[x];i;i=nex[i]){
if(to[i]!=fa){
dfs(x,to[i]);
siz[x]+=siz[to[i]];
}
}
g[x][1]=f0[x][1]=f1[x][1]=0;
for(i=2;i<=siz[x];i++)g[x][i]=f0[x][i]=f1[x][i]=inf;
s=1;
for(i=h[x];i;i=nex[i]){
if(to[i]!=fa){
for(j=s;j>0;j--){
for(k=1;k<=siz[to[i]];k++){
min(g[x][j+k],g[x][j]+g[to[i]][k]+2*w[i]);
min(f0[x][j+k],f0[x][j]+g[to[i]][k]+2*w[i]);
min(f0[x][j+k],g[x][j]+f0[to[i]][k]+w[i]);
min(f1[x][j+k],g[x][j]+f1[to[i]][k]+2*w[i]);
min(f1[x][j+k],f0[x][j]+f0[to[i]][k]+w[i]);
min(f1[x][j+k],f1[x][j]+g[to[i]][k]+2*w[i]);
}
}
s+=siz[to[i]];
}
}
}
int main(){
int n,k,i,x,y,z,ans;
scanf("%d%d",&n,&k);
for(i=1;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dfs(0,1);
ans=inf;
for(i=1;i<=n;i++){
if(siz[i]>=k){
min(ans,f0[i][k]);
min(ans,f1[i][k]);
}
}
printf("%d",ans);
}
[xsy2724]Tree的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode 笔记 101 - Symmetric Tree
题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...
随机推荐
- day06_06 字典操作01
1.0 字典操作 dic1 = {'name':'alex'} dic1['age'] = 18 print(dic1) #>>>{'age': 18, 'name': 'alex' ...
- 易语言.开源(绝地求生多功能盒子)类似LOL盒子
下载地址:https://pan.baidu.com/s/1OXwCjGJODkcZVrCwVixu3Q 成品地址:https://pan.lanzou.com/i0rmdwj
- 孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类尝试第一天
孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类,尝试第一天 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 按上一天的规划,这是根据过去我自学其它编程语 ...
- UEFI
UEFI,全称Unified Extensible Firmware Interface,即“统一的可扩展固件接口”,是一种详细描述全新类型接口的标准,是适用于电脑的标准固件接口,旨在代替BIOS(基 ...
- PHP如何实现第三方分享
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- 关于usr/bin/ld: cannot find -lxxx问题总结(Qt编译错误cannot find -lGL)
决定终结这个问题!(网上要想找到完整的解答实在太难了) http://blog.sciencenet.cn/blog-676535-541444.html 前两天手贱,把虚拟机玩崩溃了,只好重装虚拟机 ...
- Java API操作ZooKeeper
创建会话 package org.zln.zk; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watch ...
- 浅析Kerberos原理,及其应用和管理
文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/5269739.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...
- xpath属性值的模糊匹配
得至:http://bbs.csdn.net/topics/390857942 最后一楼 //div[contains(@class,'Number Skill')]
- [UOJ#348][WC2018]州区划分
[UOJ#348][WC2018]州区划分 试题描述 小 \(S\) 现在拥有 \(n\) 座城市,第ii座城市的人口为 \(w_i\),城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 ...