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

洛谷 P1922:女仆咖啡厅桌游吧 ← 树形DP

【题目来源】
https://www.luogu.com.cn/problem/P1922

【题目描述】
小 v 所在的世界被规划成了树形结构,每一个节点上都可以建一个女仆咖啡厅或者桌游吧或者什么都不建。在确定点 1 为根节点之后,规划局要求:对于每一个非叶子的节点 i,设它子树(包括自己)中所有的女仆咖啡厅的数量为 cafe_i,桌游吧数目为 table_i,都有 cafe_i=table_i。
妹妹的问题是:这棵树最多能放多少个女仆咖啡厅。

【输入格式】
输入的第一行是,一个正整数 n,表示世界节点数。
第 2 至 n 行,每行两个正整数 u,v,表示 u 与 v 间有一条边。

【输出格式】
只有一行,最多能放的女仆咖啡厅的个数。

【输入样例】
5
1 2
2 3
3 4
2 5

【输出样例】
2

【数据范围】
对于 30% 的数据,保证 n≤20。
对于 100% 的数据,保证 1≤n≤10^5,1≤u,v≤n。

【算法分析】
● 本题是一道基础的“树形DP”问题。

● 理论上,一个节点的叶子节点数量可以是多个。但题目要求节点 u 的子树(含节点 u)中女仆咖啡厅的数量等于桌游吧的数量,这限制了子树的构建方式。所以,叶子节点只能独立存在,不能作为非叶子节点的子树的一部分。这是因为,如果叶子节点作为非叶子节点的子树,无法满足子树中女仆咖啡厅数量等于桌游吧数量(因为叶子节点只能只能代表 1 个位置,要么建“女仆咖啡厅”,或者建“桌游吧”,无法组合或拆分)。

● 本题代码如何判定叶子节点?本题代码采用”链式前向星“存树,将树中的每条无向边视为两条有向边进行存储。自然而然,就有了节点入度的陈述。分析可知,在此种设计下,当一个节点的入度为 1 且不是根节点时,此节点就是叶子节点。

● 在本文代码中,cnt 是一个计数器,用于统计当前节点 u 的子节点中叶子节点的数量。在 dfs 函数中,cnt 被初始化为 1,表示当前节点 u 本身可以被视为一个叶子节点(如果它没有子节点)。cnt/2 表示每两个叶子节点可以组成一个完整对(如 1 个“女仆咖啡厅”和 1 个“桌游吧”)。

● 约束条件‌:
(1)叶子节点处理‌:如果 i 是叶子节点,由于叶子节点无法作为非叶子节点的子树,因此可在叶子节点处自由选择建女仆咖啡厅、或桌游吧、或什么都不建。显然,为了最大化女仆咖啡厅,选择在叶子节点建女仆咖啡厅,此时 dp[i]=1,表示以 i 为根的子树最多能放的女仆咖啡厅的个数。
(2)非叶子节点处理‌:在非叶子节点的子树中,女仆咖啡厅的数目等于桌游吧的数目。这意味着对于非叶子节点,其子树中的女仆咖啡厅与桌游吧必须成对出现

● 动态规划
(1)状态表示
dp[i]:表示以 i 为根的子树(含 i)最多能放的女仆咖啡厅的个数。
(2)状态计算(自底向上
如果子节点 j 的入度 ind[j] 为 1,说明 j 是一个叶子节点,此时 cnt 增加 1。
如果子节点 j 不是叶子节点,则将子节点 j 的 dp 值累加到当前节点 u 的 dp 值中。

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int N=1e5+5;
int e[N<<1],ne[N<<1],h[N],idx;
int ind[N]; //in-degree
int dp[N];void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}void dfs(int u,int fa)  {int cnt=1; //cnt of leaf nodes of u's childfor(int i=h[u]; i!=-1; i=ne[i]) {int j=e[i];if(j!=fa) {dfs(j,u);if(ind[j]==1) cnt++;else dp[u]+=dp[j];}}dp[u]+=cnt/2;
}int main() {memset(h,-1,sizeof h);int n;cin>>n;for(int i=1; i<n; i++) {int a,b;cin>>a>>b;add(a,b),add(b,a);ind[a]++,ind[b]++;}dfs(1,0);cout<<dp[1]<<endl;return 0;
}/*
in:
5
1 2
2 3
3 4
2 5out:
2
*/





【参考文献】
https://www.luogu.com.cn/problem/solution/P1922
https://developer.aliyun.com/article/1039179
https://mp.weixin.qq.com/s/k-c63sotpWgVvECsV-9SZw
https://www.cnblogs.com/cangT-Tlan/p/8227355.html





 

http://www.jsqmd.com/news/59452/

相关文章:

  • VNA专用高频测试电缆定制方案与技术应用指南
  • 2025年本地的风机盘管出风箱/风机盘管分风箱厂家最新权威推荐排行榜
  • PbootCMS网站获取指定栏目下面所有单页内容办法(PbootCMS 获取栏目下所有单页内容的方法与代码示例)
  • 2025去英国留学哪个中介好
  • 2025年五大生物绳填料供应商排行榜,生物绳填料定制品牌商新
  • 2025宁波英国留学中介有哪些
  • 2025宁波英国留学中介哪个好
  • 2025年重庆AI搜索排名品牌企业推荐:看看哪家服务性价比高
  • 2025南京英国留学中介排名
  • 完整教程:Mamba YOLO: 基于状态空间模型的目标检测简单基线
  • linux三剑客-awk实战组合用法
  • 口碑不错的吐司连续切片机生产厂家推荐
  • 开放式厨房绝配!2025年油烟吸力表现卓越的十大集成灶品牌权威推荐
  • 题解:Kuangyeyes Random Number
  • LightRAG:图增强检索框架,索引速度提升10倍
  • C语言基础数据类型
  • 国产化工业实时数据库推荐指南:麦杰科技聚焦核心需求,锁定实力之选
  • Top级高中物理辅导老师榜单:考点直击提分稳,家长学生放心选
  • MyBatis 进阶治理点——缓存、副作用、拦截与批处理的得失分析
  • 2025年哈尔滨全屋定制公司排名TOP5:汇源全屋定制品质优
  • 2025年有实力育雏育成养鸡设备/养鸡设备厂家推荐及采购指南
  • 2025年超低温防爆高低温一体机厂家推荐及采购指南
  • 2025年热门的注塑脚垫TPE颗粒/TPE颗粒料TOP品牌厂家排行榜
  • 2025年质量好的家用别墅电梯/观光别墅电梯厂家最新推荐排行榜
  • 2025年度中国媒介投放服务商TOP10权威榜单:精准赋能品牌增长
  • 2025年靠谱的橱衣柜拉手/铝合金衣柜拉手实力厂家TOP推荐榜
  • 2025年12月真空袋厂家采购指南:行业现状与优质供应商筛选策略
  • 2025年12月青岛海鲜饭店推荐榜单:五家知名餐厅综合对比与选择指南
  • 2025年如何安装自动环形绕线机厂家实力及用户口碑排行榜
  • 2025年热门的皮革挂衣杆最新TOP厂家排名