upc51-种树 实现:树形dp+换跟+剪枝
状态
题目描述
BLUESKY007喜欢种树。一天,她得到了一棵n个点的树,其中节点i重量为wi。
在种树之前,BLUESKY007需要用起重机把树吊起。由于她只有一台起重机,所以她只能选择一个点作为受力点。根据BLUESKY007所在世界的物理知识,吊起一棵树需要做的功为
,其中disi表示节点i与受力点之间的距离(边数)。
由于吊起这棵树的费用与所做的功正相关,所以BLUESKY007希望所做的功尽可能小。请你帮助她求出吊起这棵树所做的功的最小值。
输入
第一行包含一个整数n,表示树的点数。
第二行包含n个整数w1,w2,…,wn,其中wi表示节点i的重量。
接下来的n−1行中,每行包含两个数u,v,表示u和v两点之间有连边。
输出
一个整数,表示最小做功。
样例输入 Copy
【样例1】 4 1 2 3 4 1 2 2 3 3 4 【样例2】 4 3 2 1 4 1 2 2 3 3 4
样例输出 Copy
【样例1】 8 【样例2】 12
提示
对于45%的数据,n≤1000。
对于100%的数据,2≤n≤2⋅105,1≤wi≤108,1≤u,v≤n,u≠v。
思路:以任意一个为跟,求出其功,再换跟比较得出最小值
实现:此题构造无向图,以跟为起点,外向扩展遍历
dep[u]为u离跟距离,size[u]为以u为跟子树重量和,w[u]为u重量
剪枝操作:(参考大神)设以1为根结点,dep[u]表示u到根的路径长度,size[u]表示以u为根的子树中所有结点的重量和,当以1为根结点时,dfs一遍求出总做功的值,即sum=∑w[u]∗dep[u]sum=∑w[u]∗dep[u]。接着考虑换根带来的影响,当根从u换到儿子结点v时,v所在的子树少做功size[v],v外的结点多做功size[1]-size[v],即sum′=sum−size[v]+(size[1]−size[v])=sum−2∗size[v]+size[1]sum′=sum−size[v]+(size[1]−size[v])=sum−2∗size[v]+size[1]。
要使sum′≤sumsum′≤sum,则sum−2∗size[v]+size[1]≤sumsum−2∗size[v]+size[1]≤sum,即size[1]≤2∗size[v]size[1]≤2∗size[v],所以在换根时,只有满足2∗size[v]≥size[1]2∗size[v]≥size[1]的儿子结点v才可能使得总做功值变小,可以利用这个条件进行剪枝。
accode:
#include<iostream>
#include <cstring>
using namespace std;
const int N =1e6;
int e[N],ne[N],h[N],idx;
long long size[N],dep[N],sum,ans=1e18;;
int n,w[N];
void dfs(int u,int fa)//fa为u的father
{
sum+=w[u]*dep[u];//以u为跟的总功
size[u]=w[u];//先加本身根节点,以u为跟总重量
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==fa)continue;//因为无向
dep[j]=dep[u]+1;
dfs(j,u);
size[u]+=size[j];//累加
}
}
void change_root(int u,int fa,long long sum)
{
ans=min(ans,sum);
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==fa)continue;
long long temp=sum-2*size[j]+size[1];
if(2*size[j]>=size[1])change_root(j,u,temp);
}
}
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int main()
{
memset(h,-1,sizeof h);
cin>>n;
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
add(a,b),add(b,a);
}
dfs(1,-1);
change_root(1,-1,sum);
cout<<ans<<endl;
return 0;
}
upc51-种树 实现:树形dp+换跟+剪枝相关推荐
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...
- 『树形DP·换根法』Accumulation Degree
题目描述 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边. 每条河道都有一个容量,连接 x 与 y 的河道的容量记为 ...
- [BZOJ3677/UOJ#105][APIO2014]Beads and wires 连珠线(树形dp+换根)
Address https://www.lydsy.com/JudgeOnline/problem.php?id=3677 http://uoj.ac/problem/105 Solution 考虑一 ...
- Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)
心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...
- 最大疯子树-树形dp+换根+二次扫描
分析: 疯子树肯定还是一棵树. 所以,所谓的最短路径就是吓唬你的,树上两点之间有且只有一条路径. b1和b2必须是相邻的,否则不可能是一棵疯子树. 再想一想,用同样的方式构造剩下的点的话,那么可以得到 ...
- P4827-[国家集训队]Crash 的文明世界【树形dp,换根法,斯特林数】
正题 题目链接:https://www.luogu.com.cn/problem/P4827 题目大意 一颗nnn个点的树,定义dis(i,j)dis(i,j)dis(i,j)表示树上i,ji,ji, ...
- P4284-[SHOI2014]概率充电器【树形dp,换根法,数学期望】
正题 题目链接:https://www.luogu.com.cn/problem/P4284 题目大意 nnn个点的一棵树,每个点有pip_ipi概率通电,每个边有一定概率可以导电.求期望有电的节点 ...
- jzoj3844-统计损失【树形dp,换根法】
正题 题目链接:https://jzoj.net/senior/#main/show/3844 题目大意 一棵树,求每条路径的点权乘积之和. 解题思路 若只考虑从xxx出发往子树的路径,那么有fx=a ...
- [题解](树形dp/换根)小x游世界树
2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...
- 树形(dp+换根dp)
普通树形dp 树形dp通常围绕根节点来写状态转移方程 用一道基础的树形dp例题来具体分析: 没有上司的舞会 Ural 大学有 N 名职员,编号为 1∼N. 他们的关系就像一棵以校长为根的树,父节点就是 ...
最新文章
- 如何在Python中捕获SIGINT?
- mysql 查询近几天的数据
- 操作系统:体验Windows 11,不到1M的小工具来了!
- socket中的几个数据结构
- Svchost进程应用技巧
- (ExcelVBA编程入门范例)
- PLSQL Developer 安装使用教程详解
- 操作系统实验·字符设备驱动程序
- 元胞自动机与疏散模型的matlab算法,元胞自动机模拟多出口疏散模型的matlab实现...
- 2021年与 Linux 有关的几件大事
- CTF新手抓包找flag
- 【记录】好用的字体识别工具(网站)
- wordpress php教程 pdf,wordpress
- MOOS-ivp 实验一 MOOS软件的安装与执行
- CentOS下 Meld安装(文件和文件夹比较)的两种方式
- FCES2019 panel5:北大、南大、浙大的人工智能课程是如何建设的?
- 图像分类:从13个Kaggle竞赛中总结技巧
- oracle expdp 06512,oracle的expdp时出现ORA-39125ORA-01555ORA-06512错误导致数据库备份失败!...
- 南加大计算机研究生录取率,美国南加州大学研究生录取率
- 九寨沟7.0级大地震,希望大家都能够平安
热门文章
- 学习平面设计的去哪学,平面设计一般学多久:夏雨老师
- 图特摩斯三世厚积薄发
- POODLE SSLv3 安全漏洞 (CVE-2014-3566)
- Spark stand a lone 模式
- 茶 与 茶道 之 人生如茶
- 延时降低90% | 国内首份《超低延时直播(快直播)白皮书》技术解码
- python数据分析——简单且有用的代码
- html中%3ch3%3e有颜色吗,typo.html
- 叮叮获取所有用户信息_使用Postman获取微信公众号用户列表,循环遍历查询所有用户的详细信息...
- 【本人已解决】win7和win2008R2无法安装vmtools以及安装vmtools是灰色的解决方案