上海计算机学会 2023年10月月赛 乙组T4 树的覆盖(树、最小点覆盖、树形dp)

第四题:T4树的覆盖

标签:树、最小点覆盖、树形 d p dp dp
题意:求树的最小点覆盖集的大小和对应的数量,数量对 1 , 000 , 000 , 007 1,000,000,007 1,000,000,007取余数。
所谓覆盖集,是该树的点构成的集合,对树上每一条边,至少有一个顶点属于该集合。某个特定覆盖集的大小就是该集合中点的数量。
题解
第一问:最小点覆盖集的大小比较好求,也是非常经典的一个模型,和上题树形 d p dp dp差不多,对于每个节点 u u u分一下两种情况:

dp[u][0]:表示节点u属于点覆盖集,且以点u为根的子树中所连接的边都被覆盖的情况下点覆盖集中所包含最少点的个数。
dp[u][1]:表示点u不属于点覆盖集,并且以点u为根的子树中所连接的边都被覆盖的情况下点覆盖集中所包含最少点的个数。


以第二个样例举例: 4 4 4 5 5 5 6 6 6这三个节点很显然选和不选到覆盖集分别是 1 1 1 0 0 0
对于 2 2 2这个节点来说,如果选了,那么 2 2 2 5 5 5这条边,可以直接覆盖,我们加上节点 5 5 5不选的情况( d p [ 5 ] [ 1 ] dp[5][1] dp[5][1]);如果不选,那么 2 2 2 5 5 5这条边,得通过选节点 5 5 5(即加上 d p [ 5 ] [ [ 0 ] dp[5][[0] dp[5][[0])。

对应节点 3 3 3同理,然后回到节点 1 1 1来看,我们可以把节点 1 1 1选了,那么节点 2 、 3 、 4 2、3、4 234选和不选无所谓了,反正节点 1 1 1能覆盖到和他们对应的边;不选节点 1 1 1,那么节点 2 、 3 、 4 2、3、4 234都得选上(即加上 d p [ 2 ] [ 0 ] + d p [ 3 ] [ 0 ] + d p [ 4 ] [ 0 ] dp[2][0]+dp[3][0]+dp[4][0] dp[2][0]+dp[3][0]+dp[4][0])。

总结一下:

  1. 对于第一种状态 d p [ u ] [ 0 ] dp[u][0] dp[u][0],等于每个孩子节点的两种状态的最小值之和加 1 1 1,即 d p [ u ] [ 0 ] = 1 + Σ m i n ( d p [ v ] [ 0 ] , d p [ v ] [ 1 ] ) ( f a [ v ] = u ) dp[u][0]=1+Σmin(dp[v][0],dp[v][1]) \ (fa[v]=u) dp[u][0]=1+Σmin(dp[v][0],dp[v][1]) (fa[v]=u)
  2. 对于第二种状态 d p [ u ] [ 1 ] dp[u][1] dp[u][1],等于每个孩子节点的第一种状态之和,即 d p [ u ] [ 1 ] = Σ d p [ v ] [ 0 ] ( f a [ v ] = u ) dp[u][1]=Σdp[v][0] \ (fa[v]=u) dp[u][1]=Σdp[v][0] (fa[v]=u)

第二问:求最小覆盖集的数量,对于每个节点 u u u分一下两种情况:

cnt[u][0]:表示节点u属于点覆盖集,以点u为根的子树,当前最小覆盖集的数量
cnt[u][1]:表示点u不属于点覆盖集,以点u为根的子树,当前最小覆盖集的数量
  1. c n t [ u ] [ 1 ] cnt[u][1] cnt[u][1]的状态转移方程比较好想,它的所有孩子节点都得选进覆盖集,所以对所以孩子节点的 c n t [ v ] [ 0 ] cnt[v][0] cnt[v][0]做一个乘积。即 c n t [ u ] [ 1 ] = c n t [ u ] [ 1 ] ∗ c n t [ v ] [ 0 ] cnt[u][1] = cnt[u][1] * cnt[v][0] cnt[u][1]=cnt[u][1]cnt[v][0]
  2. c n t [ u ] [ 0 ] cnt[u][0] cnt[u][0]我们得去考虑,对于孩子节点 v v v来说是选还是不选能够获得更小的覆盖集大小,如果都能,得都加起来做一个乘积;否则从更小的情况转移过来做乘积。(详情看代码部分,可以自己再推导下)

代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const ll mod = 1e9 + 7;
vector<ll> e[200005];
ll n, x, dp[200005][2], cnt[200005][2];void dfs(ll u) {dp[u][0] = 1;dp[u][1] = 0;cnt[u][0] = cnt[u][1] = 1;for (ll i = 0; i < e[u].size(); i++) {ll v = e[u][i];dfs(v);if (dp[v][0] == dp[v][1]) cnt[u][0] = cnt[u][0] * (cnt[v][0] + cnt[v][1]) % mod;else if (dp[v][0] < dp[v][1]) cnt[u][0] = cnt[u][0] * cnt[v][0] % mod;else if (dp[v][0] > dp[v][1]) cnt[u][0] = cnt[u][0] * cnt[v][1] % mod;cnt[u][1] = cnt[u][1] * cnt[v][0] % mod;dp[u][0] += min(dp[v][0], dp[v][1]);dp[u][1] += dp[v][0];}
}int main() {cin >> n;for (int i = 2; i <= n; i++) {cin >> x;e[x].push_back(i);}dfs(1);cout << min(dp[1][0], dp[1][1]) << endl;if (dp[1][0] == dp[1][1]) cout << (cnt[1][0] + cnt[1][1]) % mod << endl;else if (dp[1][0] < dp[1][1]) cout << cnt[1][0] % mod << endl;else if (dp[1][0] > dp[1][1]) cout << cnt[1][1] % mod << endl;return 0;
}

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

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

相关文章

[ LeetCode ] 题刷刷(Python)-第20题:有效的括号

题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对…

docker 环境变量设置实现方式

1、前言 docker在当前运用的越来广泛&#xff0c;很多应用或者很多中间软件都有很多docker镜像资源&#xff0c;运行docker run 启动镜像资源即可应用。但是很多应用或者中间件有很多配置参数。这些参数在运用过程怎么设置给docker 容器呢&#xff1f;下面介绍几种方式 2 、do…

输入两个链表,找出它们的第一个公共结点。当不存在公共节点时,返回空节点。

class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *p1 headA; ListNode *p2 headB; while (p1 ! p2) { if(p1 ! NULL)//p1没有走到结尾 p1 p1->next;//p1指向下一…

无线网络安全之WiFi Pineapple初探

背景 WiFi Pineapple&#xff08;大菠萝&#xff09;是由国外无线安全审计公司Hak5开发并售卖的一款无线安全测试神器。集合了一些功能强大的模块&#xff0c;基本可以还原钓鱼攻击的全过程。在学习无线安全时也是一个不错的工具&#xff0c;本文主要讲WiFi Pineapple基础配置…

MongoDB聚合运算符:$regexFind

MongoDB聚合运算符&#xff1a;$regexFind $regexFind在聚合表达式中提供正则表达式&#xff08;regex&#xff09;模式匹配功能。如果找到匹配&#xff0c;则返回包含第一个匹配信息的文档。如果未找到匹配&#xff0c;则返回空值。 在MongoDB 4.2 之前&#xff0c;聚合管道…

Python中CSRF攻击是什么

CSRF&#xff08;跨站请求伪造&#xff0c;Cross-Site Request Forgery&#xff09;攻击是一种网络攻击方法&#xff0c;它迫使终端用户在当前已认证的Web应用中执行非授权的命令。攻击者利用用户的信任&#xff0c;诱导或通过其他方式使用户的浏览器产生对受信任站点的恶意请求…

【Python】如何在Ubuntu上设置Python脚本开机自启

你不知道我为什么狠下心 盘旋在你看不见的高空里 多的是 你不知道的事 蝴蝶眨几次眼睛 才学会飞行 夜空洒满了星星 但几颗会落地 我飞行 但你坠落之际 很靠近 还听见呼吸 对不起 我却没捉紧你 &#x1f3b5; 王力宏《你不知道的事》 前置要求 确保你的Ub…

和鲸科技将参与第五届空间数据智能学术会议并于应急减灾与可持续发展专题论坛做报告分享

ACM SIGSPATIAL中国分会致力于推动空间数据的研究范式及空间智能理论与技术在时空大数据、智慧城市、交通科学、社会治理等领域的创新与应用。ACM SIGSPATIAL中国分会创办了空间数据智能学术会议&#xff08;SpatialDI&#xff09;&#xff0c;分会将于2024年4月25日-27日在南京…

javaWeb项目-快捷酒店管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

PSCAD|应用于输电线路故障测距的行波波速仿真分析

1 主要内容 该程序参考文献《应用于输电线路故障测距的行波波速仿真分析》&#xff0c;利用线路内部故障产生的初始行波浪涌达线路两端测量点的绝对时间之差值计算故障点到两端测量点之间的距离&#xff0c;并利用小波变换得到初始行波波头准确到达时刻&#xff0c;从而精准定…

富文本在线编辑器 - tinymce

tinymce 项目是一个比较好的富文本编辑器. 这里有个小demo, 下载下来尝试一下, 需要配置个本地服务器才能够访问, 我这里使用的nginx, 下面是我的整个操作过程: git clone gitgitee.com:chick1993/layui-tinymce.git cd layui-tinymcewget http://nginx.org/download/nginx-1.…

JavaEE:JVM

基本介绍 JVM&#xff1a;Java虚拟机&#xff0c;用于解释执行Java字节码 jdk&#xff1a;Java开发工具包 jre&#xff1a;Java运行时环境 C语言将写入的程序直接编译成二进制的机器语言&#xff0c;而java不想重新编译&#xff0c;希望能直接执行。Java先通过javac把.java…

RK3568 学习笔记 : 更改 u-boot spl 中的 emmc 的启动次序

环境 开发板&#xff1a; 【正点原子】 的 RK3568 开发板 ATK-DLRK3568 u-boot 版本&#xff1a;来自 【正点原子】 的 RK3568 开发板 Linux SDK&#xff0c;单独复制出来一份&#xff0c;手动编译 编译环境&#xff1a;VMware 虚拟机 ubuntu 20.04 问题描述 RK3568 默认 …

浅谈线程的生命周期

Java线程的生命周期是一个从创建到终止的过程&#xff0c;经历了多种状态的转变。在Java中&#xff0c;线程的生命周期可以划分为以下几个主要状态&#xff1a; 新建&#xff08;New&#xff09;&#xff1a; 当使用 new Thread() 创建一个新的线程对象但尚未调用 start() 方法…

CSS基础之伪元素选择器(如果想知道CSS的伪元素选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;我们已经知道了在CSS中&#xff0c;选择器有基本选择器、复合选择器、伪类选择器、那么选择器学习完了吗&#xff1f;显然是没有的&#xff0c;这篇文章讲解最后一种选择器——伪元素选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

【linux】mobaterm如何kill pycharm进程

【linux】mobaterm如何kill pycharm进程 【先赞后看养成习惯】求点赞关注收藏&#x1f600; 使用云服务器时&#xff0c;pycharm在打开状态下&#xff0c;不小心关了mobaxterm&#xff0c;然后再输入pycharm.sh就会打不开pycharm&#xff0c;显示已经打开报错&#xff1a;Com…

软考131-上午题-【软件工程】-软件可靠性、可用性、可维护性

可靠性、可用性和可维护性是软件的质量属性&#xff0c;软件工程中&#xff0c;用 0-1 之间的数来度量。 0.66 66% 1、 可靠性 可靠性是指一个系统对于给定的时间间隔内、在给定条件下无失效运作的概率。 可以用 MTTF/ (1MTTF) 来度量&#xff0c;其中 MTTF 为平均无故障时间…

Java单源最短路径知识点(含面试大厂题和源码)

单源最短路径问题是指在加权图中&#xff0c;找到从单个源点到其他所有点的最短路径的问题。这是图论和网络优化中的一个经典问题&#xff0c;具有广泛的应用&#xff0c;如网络路由、交通规划、社交网络分析等。解决单源最短路径问题的算法有很多&#xff0c;其中最著名的包括…

PHP一句话木马

一句话木马 PHP 的一句话木马是一种用于 Web 应用程序漏洞利用的代码片段。它通常是一小段 PHP 代码&#xff0c;能够在目标服务器上执行任意命令。一句话木马的工作原理是利用 Web 应用程序中的安全漏洞&#xff0c;将恶意代码注入到服务器端的 PHP 脚本中。一旦执行&#xf…

Java 分页查询

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…