当前位置: 首页 > news >正文

洛谷 P3478 [POI 2008] STA-Station

【题目链接】

洛谷 P3478 [POI 2008] STA-Station

【题目考点】

1. 树形动规:换根动规

换根动规,又名二次扫描法,一般是给一颗不定根树,通过两次扫描来求解。
我们可以先任选一个根结点root,通过树形动规的思想计算出一个答案。再考虑当root的子结点作为根结点时,答案的变化。
换根动规的三个步骤:

  1. 指定某个结点为根结点root。
  2. 第一次搜索完成预处理,得到以root为根的解。孩子=>根。
  3. 第二次搜索进行换根动规,由已知解的结点推出相邻结点的解。根=>孩子。

【解题思路】

dpdpdp数组,dpudp_udpu表示以结点u为整棵树的根时所有结点的深度之和,在无权图中,就是所有结点到根结点的路径长度之和。
sizusiz_usizu表示在有根树中以u为根的子树的结点数量。
先将结点1设为整棵树的根结点,进行第一趟dfs,深搜时可知访问到的结点的深度,将深度加和保存在dp1dp_1dp1。与此同时可以求出sizsizsiz数组,即以结点1为根的有根树中每个子树的结点数。
接下来第二趟dfs,进行换根动规。dfs从结点u访问到邻接点v时,就尝试将整棵树的根从结点u转移到结点v,考察转移后所有结点到整棵树根结点的路径加和的变化。
以v为根的子树中的结点从考虑到结点u的路径转变为考虑到结点v的路径,每条路径长度减少1,共有sizvsiz_vsizv个结点到根结点的路径长度减少,总减少长度为sizvsiz_vsizv
v的上方子树(除去以v为根的子树外其它结点构成的子树)的结点数为n−sizvn-siz_vnsizv,从考虑这些结点到结点u的路径转为考虑这些结点到结点v的路径,每条路径长度增加1,总增加长度为n−sizvn-siz_vnsizv
因此以结点v为整棵树根结点时,所有结点到v的路径长度加和即所有结点的深度加和为dpv=dpu−sizv+n−sizvdp_v = dp_u-siz_v+n-siz_vdpv=dpusizv+nsizv。这是从双亲到孩子的转移,因此该状态转移方程应该写在调用dfs从孩子开始搜索的语句之前。
最后求出dp数组大值的下标,即为本题的结果。求最大值下标的过程可以在dfs的过程中进行。

【题解代码】

解法1:树形动规 换根动规

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int n, dep[N], siz[N], mxi = 1;
vector<int> edge[N];
long long dp[N];//dp[u]:整棵树以u为根时所有结点的深度之和 
void dfs1(int u, int fa, int dep)
{dp[1] += dep;siz[u] = 1;for(int v : edge[u]) if(v != fa){dfs1(v, u, dep+1);siz[u] += siz[v];}
}
void dfs2(int u, int fa)
{for(int v : edge[u]) if(v != fa){dp[v] = dp[u]-siz[v]+n-siz[v];dfs2(v, u);}if(dp[u] > dp[mxi])mxi = u;
}
int main()
{int u, v;cin >> n;for(int i = 1; i < n; ++i){cin >> u >> v;edge[u].push_back(v);edge[v].push_back(u);}dfs1(1, 0, 0);dfs2(1, 0);cout << mxi;return 0;
}
http://www.dtcms.com/a/293182.html

相关文章:

  • Ollama Docker 容器向容器内传输AI模型并挂载模型
  • 基于快速S变换的配电网故障选线
  • Android开发:Java与Kotlin深度对比
  • IDC权威认可:瑞数信息双项入选《中国大模型安全保护市场概览》
  • CSS+JavaScript 禁用浏览器复制功能的几种方法
  • AWE2026启动:加码AI科技,双展区联动开启产业新格局
  • LeetCode 刷题【11. 盛最多水的容器】
  • Zap日志库指南
  • PCIe Base Specification解析(三)
  • java多线程编程自用笔记
  • 论文笔记:EMR-MERGING: Tuning-Free High-Performance Model Merging
  • 2025.7.22 测试 总结
  • Qt/C++源码/监控设备模拟器/支持onvif和gb28181/多路批量模拟/虚拟监控摄像头
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ImageCarousel(图片轮播组件)
  • linux应用:spi_ioc_transfer结构cs_change说明
  • 【实时Linux实战系列】实时文件系统的特性与优化
  • 深入解析Hadoop中的Region分裂与合并机制
  • Adam、AdamW介绍,以及AdamW优势
  • 数控机床上滚珠螺杆故障怎么解决?
  • HITL节点介绍(Human-in-the-loop nodes)(指在自动化流程(如AI工作流或系统)中,允许人类在关键步骤直接参与、干预或修正的节点)
  • 【Verilog】竞争、冒险
  • 11.Java三大特性
  • 知识付费平台源码开发详解:内容审核、版权保护与防盗机制全方案
  • IMU(LSM6DSMTR+LIS2MDLTR)
  • STL学习(一、string容器)
  • C# 基于halcon的视觉工作流-章21-点查找
  • freertos任务调度关键函数理解 vTaskSwitchContext
  • 编程基础:常见数据类型详解
  • Kubernetes 服务发布基础
  • 从云端到指尖:MNN实现端侧大模型“量子压缩”