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

P2279 [HNOI2003] 消防局的设立 题解加总结

正题之前

又是一道抓耳挠腮想了好久的好题, AC 了之后,感觉自己的思想又得到了洗礼 QwQ ,第一次写题解,有错望老师见谅

题目传送门


思路

因为题目求的是覆盖树上所有点的所放置最少的消防站数量,因此此题需使用树形 DP 解决

状态申明

因为每个"消防局"能覆盖与它距离不超过 2 的节点 ,因此
总共设有5个状态

  • dp[x][0] 为覆盖到 \(x\) 的爷爷(包括父亲)和 \(x\) 整棵子树的最少个数;
  • dp[x][1] 为覆盖到 \(x\) 的父亲和 \(x\) 整棵子树的最少个数;
  • dp[x][2] 为覆盖 \(x\) 整棵子树的最少个数;
  • dp[x][3] 为覆盖所有 \(x\) 的儿子及其子树的最少个数;
  • dp[x][4] 为覆盖所有 \(x\) 的孙子及其子树的最少个数;

状态转移方程

  • dp[x][0] = 1 \(+\) dp[y][4] ( \(y\)\(x\) 的孩子 )

要覆盖到爷爷的话必须选 \(x\) ,并贪心地选 \(y\) 的第五种状态

  • dp[x][1] = min ( dp[y][0] + dp[k][3] )( \(y\)\(k\) 皆为 \(x\) 的孩子且 \(y\) \(k\) )

\(x\) 的儿子中有一个一定覆盖的爷爷,同时覆盖到兄弟(因为 \(y\) 一定是选了),其他的儿子只需要覆盖的自己的儿子即可

  • dp[x][2] = min ( dp[y][1] + dp[k][2] )( \(y\)\(k\) 皆为 \(x\) 的孩子且 \(y\) \(k\) )

有一个儿子覆盖到父亲,但无法覆盖到 \(y\) 的兄弟,所以其他儿子要覆盖到自己

  • dp[x][3] = dp[y][2] ( \(y\)\(x\) 的孩子 )

让每个儿子覆盖到自己

  • dp[x][4] = dp[y][3] ( \(y\)\(x\) 的孩子 )

让每个儿子覆盖到自己的儿子

遍历顺序

由叶子节点到根

边界条件

  • 叶子节点

dp[x][0] = dp[x][1] = dp[x][2] =1 ;
dp[x][3] = dp[x][4] = 0 ;

  • 非叶子节点

dp[x][0] = 1 , dp[x][1] = dp[x][2] = \(\infty\) ;
dp[x][3] = dp[x][4] = 0 ;

输出答案

dp[1][2](根包含自己和所有子树的最小答案)

评估效率

时间复杂度:\(O (n)\) $ \ \ \ \ $ 空间复杂度:\(O (n)\)

注意

因为 dp[x][0] 的答案包含 dp[x][1 ~ 4] , dp[x][1] 的答案包含 dp[x][2 ~ 4]。同理,因此 dp[x][4] \(\le\) dp[x][3] \(\le\) dp[x][2] \(\le\) dp[x][1] \(\le\) dp[x][0] , 但如果 dp[x][i] < dp[x][i+1],因此就该跟新 dp[x][i+1] 。

AC代码

点开有惊喜
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll INF=1e18;
ll n,y,dp[1005][5];
vector<ll>t[100005];
void dfs(ll x,ll fa){ll cnt=0,s2=0,s3=0;for(auto y:t[x]){if(y==fa) continue;dfs(y,x);s2+=dp[y][2];s3+=dp[y][3];cnt++;}if(!cnt){dp[x][0]=dp[x][1]=dp[x][2]=1;dp[x][3]=dp[x][4]=0;return;}dp[x][0]=1;dp[x][1]=dp[x][2]=INF;dp[x][3]=0;dp[x][4]=0;for(auto y:t[x]){if(y==fa) continue;dp[x][0]+=dp[y][4];dp[x][1]=min(dp[y][0]+s3-dp[y][3],dp[x][1]);dp[x][2]=min(dp[y][1]+s2-dp[y][2],dp[x][2]);dp[x][3]+=dp[y][2];dp[x][4]+=dp[y][3];}for(int i=1;i<5;i++)dp[x][i]=min(dp[x][i],dp[x][i-1]);
}
int main(){cin>>n;for(int i=1;i<n;i++){cin>>y;t[i+1].push_back(y);t[y].push_back(i+1);}dfs(1,0);cout<<dp[1][2];return 0;
}
http://www.zskr.cn/news/47555.html

相关文章:

  • 售后无忧!CRMEB售后订单处理指南,高效管理退款退货流程
  • 5分钟极简代码:轻松学会XXTEA加密解密
  • 更新了!微信公众号文章数据批量导出excel软件1.1版,轻松实现统计分析
  • 中国数据集成平台TOP10综合评估报告(2025)
  • 从“实时分账”到“智能问数”:汇付天下以“Data Agent”重塑支付业务决策效率
  • 热身赛总结 题解
  • 开盖扫码领红包小程序系统:实体商家的营销增长利器
  • 海报积分商城小程序:高效吸粉与礼品兑换的全能解决方案
  • 习题解析之:正负交错数列前n项和
  • 详细介绍:【Kylin V10】Ambari3.0.0 安装 Unexpected error Ambari repo file path not set for current OS 报错解决
  • 实战干货:Apache DolphinScheduler 参数使用与优化总结
  • 实用指南:Rust Slint实现列表式消息提示(Notification Dialog)源码分享
  • RED 状态
  • EMS4100N芯祥科技USB3.1高速双向模拟开关芯片资料,可pin对pin替代ASW3410
  • 2025年网络攻防领域常用工具、软件及其应用场景
  • NSIS启动前检测字体缺失,静默安装字体
  • github action 个人项目实践
  • 2025年1.5吨蒸汽发生器源头厂家权威推荐榜单:优质蒸汽发生器/商用蒸汽发生器/暖特加蒸汽发生器源头厂家精选
  • 10分钟搞懂!化学人刚需的6大核心期刊
  • 2025-2026年水质测定仪品牌推荐:总磷/总氮/氨氮/COD测定仪哪个品牌好?
  • 2025年电镜实验室安装订做厂家权威推荐榜单:电镜实验室设计/电镜安装/电镜实验室建设源头厂家精选
  • 激光二极管增透膜技术:提升光学性能的关键方案
  • 【传奇开心果系列】基于Flet框架实现的桌面代码登录验证和SQLite 数据库结合实现数据持久化和多页面导航自定义组件模板特色和达成原理深度解析
  • 2025预埋件/幕墙/钢结构预埋件厂家推荐鑫诚源,专业生产各类连接件
  • 2025铝排/铝棒/铝板厂家推荐山东宜发,导电合金材质齐全品质保障
  • 一份用pyhon生成word/wps文档的代码
  • 2025年比较好的超强承重天地铰链厂家实力及用户口碑排行榜
  • MX Round 23 解题报告
  • 2025年质量好的载带成型机用户口碑最好的厂家榜
  • 2025年热门的立式明装风机盘管TOP品牌厂家排行榜