首页 > 其他分享 >树的中心——树形dp/换根dp启蒙

树的中心——树形dp/换根dp启蒙

时间:2023-12-05 22:15:22浏览次数:33  
标签:int ed dfs 树形 d2 换根 dp d1

请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。这个点被称为树的中心。

题解:https://www.cnblogs.com/dx123/p/17302104.html
评测:https://www.acwing.com/problem/content/1075/
暴力做法是以每个点为根,求出从根向下走的最远距离,这个过程需要做n遍,每一遍dfs的复杂度是O(n),时间复杂度是O(n^2),考虑优化。

https://oi-wiki.org/dp/tree/#换根-dp

树形 DP 中的换根 DP 问题又被称为二次扫描,通常不会指定根结点,并且根结点的变化会对一些值,例如子结点深度和、点权和等产生影响。

通常需要两次 DFS,第一次 DFS 预处理诸如深度,点权和之类的信息,在第二次 DFS 开始运行换根动态规划。

算法讲解:
第一次dfs和求树的直径的时候一样,通过递归从下而上得到从 u点向下走的最远距离,根据题目我们还需要将这个答案去和u点向上走的距离去比较。
在第二次dfs中,我们需要充分利用第1次dfs的信息,对于当前的点j,它的父节点是u。
第二次的dfs是从上而下类似拓扑序去更新的。

  • 如果j在u的下最长路,那么j的上最长路需要考虑是 j与u的距离+max(u的下次长路,u的上最长路)
  • 如果j不在u的下最路,那么j的上最长路需要考虑是 j与u的距离+max(u的次最长路,u的上最长路)

根据这个过程我们知道,在第一次dfs过程中需要多维护两个数组,每个点的下次长距离自己的长链意义下的重儿子

const int N=20010;
int n,a,b,c,ans=2e9;
struct edge{int v,w;};
vector<edge> e[N];
int d1[N],d2[N],path[N],up[N];
//path数组就是自己的长链意义下的重儿子
//d2[N]记录每个点的下次长距离
void dfs(int x,int fa){
  for(auto ed : e[x]){
    int y=ed.v, z=ed.w;
    if(y==fa) continue;
    dfs(y, x);
    if(d1[y]+z>d1[x]) 
      d2[x]=d1[x],d1[x]=d1[y]+z,path[x]=y;
    else if(d1[y]+z>d2[x]) d2[x]=d1[y]+z;
  }
}
void dfs2(int x,int fa){
  for(auto ed : e[x]){
    int y=ed.v, z=ed.w;
    if(y==fa) continue;
    if(y==path[x])up[y]=max(up[x],d2[x])+z;
    else up[y]=max(up[x],d1[x])+z;
    dfs2(y, x);
  }
}
int main(){
  cin>>n;
  for(int i=1; i<n; i++){
    cin>>a>>b>>c;
    e[a].push_back({b,c});
    e[b].push_back({a,c});
  }
  dfs(1, 0);
  dfs2(1, 0);
  for(int i=1; i<=n; i++)
    ans=min(ans,max(d1[i],up[i]));//最后直接求每个点的最大距离,然后求min
  cout<<ans;
}

标签:int,ed,dfs,树形,d2,换根,dp,d1
From: https://www.cnblogs.com/mathiter/p/17878412.html

相关文章

  • 网络通信、UDP通信、TCP通信、BS架构模拟、URL了解
    网络编程可以让程序与网络上的其他设备中的程序进行数据交互所以,我们学习网络编程的主要目的就是为了实现网络通信网络通信网络通信基本模式常见的通信模式有如下2种形式:Client-Server(Cs)、Browser/Server(Bs)Client-Server(Cs)主要是客户端与服务端之间的联系(就是相应的App和后......
  • 树的直径——树形dp求法
    树上任意两节点之间最长的简单路径即为树的「直径」。树形DP的做法可以在存在负权边的情况下求解出树的直径。constintN=10010,M=20010;intn,a,b,c,ans;structedge{intv,w;};vector<edge>e[N];intdfs(intx,intfa){intd1=0,d2=0;for(autoed:e[x]){......
  • LayUI树形结构
    最近在学习LayUI学到tree组件,所以做一下随笔记录下面是我用来接收数据的类namespaceHisProject.Models{publicclassTreeListToReturn{publicstringid{get;set;}publicstringtitle{get;set;}publicList<TreeListToReturn>chil......
  • csp认证202109-4——之状态压缩dp加期望(记忆化搜索
    https://www.acwing.com/problem/content/description/4012/#include<bits/stdc++.h>usingnamespacestd;#definelllonglong//#defineintlonglong#defineullunsignedlonglong#definepiipair<int,int>//#definedoublelongdouble#define......
  • 【组成原理-指令】扩展操作码的树形解法
    仿照哈夫曼树(或前缀编码,Prefix-free)的解法,目前先不解释具体怎么画了,直接放例题,大家自己慢慢品味吧。【例1】某指令系统指令长16位,操作码字段为4位,地址码字段为4位,采用扩展操作码技术,形成三地址指令15条、二地址指令15条、一地址指令15条、零地址指令16条。【解......
  • fpd dpd vintage 滚动率
    滚动率:selecta.loan_month,b.M1/a.Cas'C-M1',c.M2/a.CAS'C-M2',d.M3/a.CAS'C-M3'from(select*fromchenqianguang.GD)asaleftjoin(select*fromchenqianguang.GD)asbona.loan_month=b.loan_monthanda.mob+1=b.mobLE......
  • 【小沐学前端】Node.js实现UDP通信
    1、node简介Node.js是一个开源的、跨平台的JavaScript运行时环境。Node.js是一个开源和跨平台的JavaScript运行时环境。它是几乎任何类型项目的流行工具!Node.js在浏览器之外运行V8JavaScript引擎(GoogleChrome的内核)。这使得Node.js非常高效。Node.js应用在......
  • react项目vite报错:UnhandledPromiseRejectionWarning: SyntaxError: Unexpected toke
    问题:vite报错:UnhandledPromiseRejectionWarning:SyntaxError:Unexpectedtoken'??='今天clone一个vite的项目,安装依赖后运行npmrundev报错:UnhandledPromiseRejectionWarning:SyntaxError:Unexpectedtoken'??='atLoader.moduleStrategy(internal/modules......
  • Qt之UDP多播(组播)的使用
    UdpSocket::UdpSocket(QObject*parent):QObject(parent){//本机IPQStringlocal_ip="192.168.101.11";m_udp_socket=newQUdpSocket(this);connect(m_udp_socket,&QUdpSocket::readyRead,this,&UdpSocket::received_data);......
  • js实现树形结构
    letcityList=[ {id:1,parentId:0,name:'江苏省'}, {id:2,parentId:0,name:'广东省'}, {id:3,parentId:0,name:'安徽省'}, {id:4,parentId:1,name:'苏州市'}, {id:5,parentId:1,name:'无锡市'}, {id:6,parentId:......