[ACM学习] 树形dp之换根

算法概述

总的来说:

题目描述:一棵树求哪一个节点为根时,XXX最大或最小

分为两步:1. 树形dp  2. 第二次dfs

问题引入

如果暴力就是 O(n^2) ,

当从1到2的时候,2及其子树所有的深度都减一,其它的点,所有的深度都加一。写成递推方程如下:

代码

思路是:第一遍 dfs 遍历的时候先把以某一确定点为根的其它各点深度和算出来,再来看我们的状态转移方程,还需要各个点的大小值,所以在遍历的时候就把它给维护好。

siz数组刚开始全为1

第二遍的时候,就是在用公式啦。

在main 函数

难点在于不同点之间怎么转移

复杂度O(n)

例题

按换根dp的思路,进行状态转移时

从1到2,原来到1的路径和ans[1] ,到2的路径和 ans[2] ,变化就是 :以2为子树的结点,路径长度少了1到2的长度,其它结点,路径长度多了1到2的长度

sum[i] : 以 i 为子树的权值和

所以,方程上的变化就是:ans[2] = ans[1] - sum[2]*(1与2之间的路径长)+ (sum[1]-sum[2])*(1与2之间的路径长)

代码

void dfs(int x,int fa){siz[x]=1;sum[x]=c[x];for(int i=head[x];i;i=edge[i].nex){int v=edge[i].to;if(v==fa)continue;dist[v]=dist[x]+edge[i].dis;dfs(v,x);siz[x]+=siz[v];sum[x]+=sum[v];}return ;
}
void dfs1(int x,int fa){for(int i=head[x];i;i=edge[i].nex){int v=edge[i].to;if(v==fa)continue;f[v]=f[x]-sum[v]*edge[i].dis+(tot-sum[v])*edge[i].dis;}return ;
}
dfs(1,0);for(int i=1;i<=n;i++){f[1]+=dist[i]*c[i];  //是把所有的点记录好到1的距离后,再全部来乘权值。}dfs1(1,0);ll ans=101010101000;for(int i=1;i<=n;i++){ans=min(ans,f[i]);}cout<<ans<<endl;
struct Edge{int nex,to,dis;
}edge[maxn<<1];
int siz[maxn],head[maxn],cnt,tot;
void add(int from,int to,int dis){edge[++cnt]={head[from],to,dis};head[from]=cnt;return ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433429.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AndroidStudio】2022.3Giraffe连接超时,更换下载源,使用本地gradle,版本对应问题

记录了使用AndroidStudio2022.3 Giraffe版本在搭建环境时遇到的问题&#xff0c;包括连接超时&#xff0c;gradle无法读取等。 如果只看如何正确的配置&#xff0c;直接跳转第3节 配置汇总 1 连接超时 项目一开始会自动下载gardle文件来加载项目 1.1 Connect timed out 基…

Vulnhub靶场DC-3

本机192.168.223.128 靶机192.168.223.139 目标发现nmap -sP 192.168.223.0/24 端口扫描nmap -p- 192.168.223.139 之开启了一个80端口 看一下是什么服务 nmap -sV -p- -A 192.168.223.139是一个apache服务&#xff0c;joomla模板 看一下web 没什么有用信息。 扫描一下后台…

高学历人士互相残害现象的深度剖析与教育体制反思

高学历人士互相残害现象的深度剖析与教育体制反思 In-Depth Analysis and Educational System Reflection on the Phenomenon of High-Educated Individuals Harming Each Other 在当今社会&#xff0c;随着教育水平的普遍提升&#xff0c;高学历人士之间的恶性事件时有发生&am…

【代码随想录15】110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

目录 110. 平衡二叉树题目描述参考代码 257. 二叉树的所有路径题目描述参考代码 404.左叶子之和题目描述参考代码 110. 平衡二叉树 题目描述 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树…

MIT_线性代数笔记:线性代数常用计算公式

目录 1.矩阵的加法和数乘2.矩阵的乘法3.转置 Transposes 相关运算 1.矩阵的加法和数乘 2.矩阵的乘法 1)标准方法&#xff08;行乘以列&#xff09; 矩阵乘法的标准计算方法是通过矩阵 A 第 i 行的行向量和矩阵 B 第 j 列的列向量点积得到 cij。即我们常说的点积&#xff0c;也…

【操作系统】调用硬盘并且实现MBR与Loader的过渡——原理篇

一.概述 前文&#xff08;【操作系统】优化MBR程序&#xff1a;让MBR调用显存吧&#xff09;中的MBR程序仅有512字节大小&#xff0c;完全不能将内核成功加载到内存并且运行&#xff0c;所以我们需要在另一个程序中完成初始化环境以及加载内核的任务&#xff0c;这个程序称之为…

pip 安装出现报错 SSLError(SSLError(“bad handshake

即使设置了清华源&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip 安装包不能配置清华源&#xff0c;出现报错: Retrying (Retry(total2, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘SSLE…

.NET中的matplotlib平替,ScottPlot简单使用

文章目录 前言解决方案Python调用.NET 原生解决 ScottPlot找到文章ScottPlot Nuget安装简单代码测试代码跑不了5.0新版本测试 总结 前言 我之前在学OpenCV 三语言开发的时候&#xff0c;遇到了一个问题&#xff0c;怎么可视化的显示数据。Python有matplotlib&#xff0c;那么C…

node.js漏洞总结

js开发的web应用和php/Java最大的区别就是js可以通过查看源代码的方式查看到编写的代码&#xff0c;但是php/Java的不能看到&#xff0c;也就是说js开发的web网页相当于可以进行白盒测试。 流行的js框架有&#xff1a; 1. AngularJS 2. React JS 3. Vue 4. jQuery 5. Backbone…

Python学习从0到1 day9 Python函数

苦难是花开的伏笔 ——24.1.25 函数 1.定义 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段 2.案例 在pycharm中完成一个案例需求&#xff1a;不使用内置函数len&#xff08;&#xff09;&#xff0c;完成字符串长度的计算 #统计字…

Django项目搭建

一、创建项目 在命令行中执行代码 $ django-admin startproject mysitedjango-admin 为内部命令startproject 为参数mysite 项目名 备注 避免使用 Python 或 Django 的内部保留字来命名项目。比如说&#xff0c;避免使用像 django (会和 Django 自己产生冲突)或 test (会和 P…

随着新年的钟声响起,一部佳作崭露头角,令人眼前一亮。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 在东北一个偏远的小县城澜河&#xff0c;发生了一起令人震惊的…