状态

题目描述

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+换跟+剪枝相关推荐

  1. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...

  2. 『树形DP·换根法』Accumulation Degree

    题目描述 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边. 每条河道都有一个容量,连接 x 与 y 的河道的容量记为 ...

  3. [BZOJ3677/UOJ#105][APIO2014]Beads and wires 连珠线(树形dp+换根)

    Address https://www.lydsy.com/JudgeOnline/problem.php?id=3677 http://uoj.ac/problem/105 Solution 考虑一 ...

  4. Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)

    心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...

  5. 最大疯子树-树形dp+换根+二次扫描

    分析: 疯子树肯定还是一棵树. 所以,所谓的最短路径就是吓唬你的,树上两点之间有且只有一条路径. b1和b2必须是相邻的,否则不可能是一棵疯子树. 再想一想,用同样的方式构造剩下的点的话,那么可以得到 ...

  6. P4827-[国家集训队]Crash 的文明世界【树形dp,换根法,斯特林数】

    正题 题目链接:https://www.luogu.com.cn/problem/P4827 题目大意 一颗nnn个点的树,定义dis(i,j)dis(i,j)dis(i,j)表示树上i,ji,ji, ...

  7. P4284-[SHOI2014]概率充电器【树形dp,换根法,数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/P4284 题目大意 nnn个点的一棵树,每个点有pip_ipi​概率通电,每个边有一定概率可以导电.求期望有电的节点 ...

  8. jzoj3844-统计损失【树形dp,换根法】

    正题 题目链接:https://jzoj.net/senior/#main/show/3844 题目大意 一棵树,求每条路径的点权乘积之和. 解题思路 若只考虑从xxx出发往子树的路径,那么有fx=a ...

  9. [题解](树形dp/换根)小x游世界树

    2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...

  10. 树形(dp+换根dp)

    普通树形dp 树形dp通常围绕根节点来写状态转移方程 用一道基础的树形dp例题来具体分析: 没有上司的舞会 Ural 大学有 N 名职员,编号为 1∼N. 他们的关系就像一棵以校长为根的树,父节点就是 ...

最新文章

  1. 如何在Python中捕获SIGINT?
  2. mysql 查询近几天的数据
  3. 操作系统:体验Windows 11,不到1M的小工具来了!
  4. socket中的几个数据结构
  5. Svchost进程应用技巧
  6. (ExcelVBA编程入门范例)
  7. PLSQL Developer 安装使用教程详解
  8. 操作系统实验·字符设备驱动程序
  9. 元胞自动机与疏散模型的matlab算法,元胞自动机模拟多出口疏散模型的matlab实现...
  10. 2021年与 Linux 有关的几件大事
  11. CTF新手抓包找flag
  12. 【记录】好用的字体识别工具(网站)
  13. wordpress php教程 pdf,wordpress
  14. MOOS-ivp 实验一 MOOS软件的安装与执行
  15. CentOS下 Meld安装(文件和文件夹比较)的两种方式
  16. FCES2019 panel5:北大、南大、浙大的人工智能课程是如何建设的?
  17. 图像分类:从13个Kaggle竞赛中总结技巧
  18. oracle expdp 06512,oracle的expdp时出现ORA-39125ORA-01555ORA-06512错误导致数据库备份失败!...
  19. 南加大计算机研究生录取率,美国南加州大学研究生录取率
  20. 九寨沟7.0级大地震,希望大家都能够平安

热门文章

  1. 学习平面设计的去哪学,平面设计一般学多久:夏雨老师
  2. 图特摩斯三世厚积薄发
  3. POODLE SSLv3 安全漏洞 (CVE-2014-3566)
  4. Spark stand a lone 模式
  5. 茶 与 茶道 之 人生如茶
  6. 延时降低90% | 国内首份《超低延时直播(快直播)白皮书》技术解码
  7. python数据分析——简单且有用的代码
  8. html中%3ch3%3e有颜色吗,typo.html
  9. 叮叮获取所有用户信息_使用Postman获取微信公众号用户列表,循环遍历查询所有用户的详细信息...
  10. 【本人已解决】win7和win2008R2无法安装vmtools以及安装vmtools是灰色的解决方案