leetcode 2581. 统计可能的树根数目【换根dp】

原题链接:2581. 统计可能的树根数目

题目描述:

Alice 有一棵 n 个节点的树,节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges 表示,其中 edges[i] = [ai, bi] ,表示树中节点 ai 和 bi 之间有一条边。

Alice 想要 Bob 找到这棵树的根。她允许 Bob 对这棵树进行若干次 猜测 。每一次猜测,Bob 做如下事情:

  • 选择两个 不相等 的整数 u 和 v ,且树中必须存在边 [u, v] 。
  • Bob 猜测树中 u 是 v 的 父节点 。

Bob 的猜测用二维整数数组 guesses 表示,其中 guesses[j] = [uj, vj] 表示 Bob 猜 uj 是 vj 的父节点。

Alice 非常懒,她不想逐个回答 Bob 的猜测,只告诉 Bob 这些猜测里面 至少 有 k 个猜测的结果为 true 。

给你二维整数数组 edges ,Bob 的所有猜测和整数 k ,请你返回可能成为树根的 节点数目 。如果没有这样的树,则返回 0

输入输出描述:

示例 1:

输入:edges = [[0,1],[1,2],[1,3],[4,2]], guesses = [[1,3],[0,1],[1,0],[2,4]], k = 3
输出:3
解释:
根为节点 0 ,正确的猜测为 [1,3], [0,1], [2,4]
根为节点 1 ,正确的猜测为 [1,3], [1,0], [2,4]
根为节点 2 ,正确的猜测为 [1,3], [1,0], [2,4]
根为节点 3 ,正确的猜测为 [1,0], [2,4]
根为节点 4 ,正确的猜测为 [1,3], [1,0]
节点 0 ,1 或 2 为根时,可以得到 3 个正确的猜测。

示例 2:

输入:edges = [[0,1],[1,2],[2,3],[3,4]], guesses = [[1,0],[3,4],[2,1],[3,2]], k = 1
输出:5
解释:
根为节点 0 ,正确的猜测为 [3,4]
根为节点 1 ,正确的猜测为 [1,0], [3,4]
根为节点 2 ,正确的猜测为 [1,0], [2,1], [3,4]
根为节点 3 ,正确的猜测为 [1,0], [2,1], [3,2], [3,4]
根为节点 4 ,正确的猜测为 [1,0], [2,1], [3,2]
任何节点为根,都至少有 1 个正确的猜测。

提示:

  • edges.length == n - 1
  • 2 <= n <= 10^5
  • 1 <= guesses.length <= 10^5
  • 0 <= ai, bi, uj, vj <= n - 1
  • ai != bi
  • uj != vj
  • edges 表示一棵有效的树。
  • guesses[j] 是树中的一条边。
  • guesses 是唯一的。
  • 0 <= k <= guesses.length

解题思路:

只是一个比较简单的困难题,我们需要求的是可能的根节点有多少个,也就是说最暴力的做法就是枚举每一个点作为根节点,然后考虑这种情况下,猜测中有多少个猜测满足要求,如果满足要求的猜测个数>=k,那么说明这种情况这个点可以作为根节点,但是这个题目n=1e5,如果直接暴力枚举每一个根结点,时间复杂度为O(n^2),这个时间复杂度肯定过不了,所以这个题目肯定不能直接枚举每一个根结点,考虑优化,需要枚举每一个根节点,也就是需要换根,我们可以换根dp进行优化,换根dp实际上就是俩次dfs,第一次dfs先确定某一个结点为根结点,计算这种情况会有多少个猜测成立,第二次dfs就是考虑换根的影响,我们不妨画个图描述一下:

如上图所示,左边图最开始0号结点为根结点,右图所示为换根操作,把根换为1号点,我们可以发现换根之后相对于换根的前一步比较,只有换根的俩个点之间父子关系发生翻转,另外的其他所有点之间的父子关系不变,发现这个性质之后我们就可以根据换根造成的影响来计算这个新树中满足要求的猜测数量,然后判断这个数量是否大于等于k,从而更新答案。

时间复杂度:O(n+m),n表示点数,m表示guesses的长度。

空间复杂度:O(n+m),n表示点数,m表示guesses的长度。

cpp代码如下:

class Solution {
public:int rootCount(vector<vector<int>>& edges, vector<vector<int>>& guesses, int k) {int ans=0,n=edges.size()+1;vector<vector<int>>g(n,vector<int>());for(auto& t:edges){   //邻接表建图int x=t[0],y=t[1];g[x].push_back(y);g[y].push_back(x);}map<pair<int,int>,int>mp;  //首先把所有的猜测存起来,用于后续判断for(auto& t:guesses){int x=t[0],y=t[1];mp[pair{x,y}]++;}function<int(int,int)>dfs1=[&](int x,int fa)->int {int res=0;for(auto& y:g[x]){if(y==fa)continue;if(mp.count(pair{x,y})){res++;}res+=dfs1(y,x);}return res;};//首先考虑0号结点为根结点时,会有多少个猜测满足要求,用cnt记录int cnt=dfs1(0,-1);if(cnt>=k)ans++;  //这种情况如果满足要求,更新答案function<void(int,int,int)>dfs2=[&](int x,int fa,int cnt){for(auto& y:g[x]){if(y==fa)continue;int val=cnt;  //每个子树都是基于cnt进行的,所以先用一个val存起来//换根相当于把x->y的边变为y->x的边,其他的边不变if(mp.count(pair{x,y})){  //把x->y的边减去val--;}if(mp.count(pair{y,x})){val++;   //把y->x的加上}if(val>=k)ans++;   //更新答案dfs2(y,x,val);}};//然后考虑换根操作dfs2(0,-1,cnt);return ans;}
};

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

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

相关文章

【appium】Hybrid应用自动化|微信小程序自动化

目录 一、Hybrid&#xff08;nativewebview&#xff09;应用自动化 1、webview 2、Hybrid应用自动化实现 2.1准备工作 Step1&#xff1a;准备android 4.4版本以上的手机/模拟器 Step2&#xff1a;在app源码中将webview调试模式打开 Step3&#xff1a;安装UC开发者工具 U…

4_相机透镜畸变

理论上讲&#xff0c;是可能定义一种透镜而不引入任何畸变的。然而现实世界没有完美的透镜。这主要是制造上的原因&#xff0c;因为制作一个“球形”透镜比制作一个数学上理想的透镜更容易。而且从机械方面也很难把透镜和成像仪保持平行。下面主要描述两种主要的透镜畸变并为他…

ICVQUANTUMCHINA报告:《2024全球量子计算产业发展展望》

2月20日&#xff0c;《2024量子计算产业发展展望》的中文版报告通过光子盒官方平台发布&#xff0c;英文版报告通过ICV官方平台发布。 英文版报告获取地址&#xff1a; https://www.icvtank.com/newsinfo/897610.html 在过去的一年里&#xff0c;光子盒与您一同见证了全球量子…

android系统开发工具,看这篇文章准没错

开头 作为一个40的人&#xff0c;能有面试机会是格外的珍惜&#xff0c;也分外的诚恳。没什么豪言壮语&#xff0c;雄心大志。没有狼性&#xff0c;社会把中年人打磨成了听话的舔狗。 感谢马爸爸旗下公司&#xff0c;给了我为数不多机会中一个&#xff0c;而且还是个相当好的…

10 款最佳硬盘分区软件知识分享(2024更新)

硬盘分区软件是您当前需要的最重要的软件之一。我们知道&#xff01; 当今的硬盘分区软件具有令人难以置信的多功能性&#xff0c;并且由于激烈的竞争&#xff0c;对于大多数人来说仍然是相对低成本的投资。 目前&#xff0c;市场上有数十种硬盘分区软件可供选择 - 找到 2024…

力扣-移除元素

问题 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

进销存是什么意思?如何开发一款进销存管理系统?

这篇给大家详细介绍一下&#xff0c;进销存到底是什么&#xff0c;进销存管理系统有什么用&#xff1f;企业如何开发一款进销存管理系统&#xff1f; 以下内容示例工具均来自于JDY——https://www.jiandaoyun.com 一、进销存是什么&#xff1f; 1、基本概念 进销存&#xff0…

HarmonyOS开发云工程与开发云函数

创建函数 您可直接在DevEco Studio创建函数、编写函数业务代码、为函数配置调用触发器。 1.右击“cloudfunctions”目录&#xff0c;选择“New > Cloud Function”。 2.输入函数名称后&#xff0c;点击“OK”。 函数名称仅支持小写英文字母、数字、中划线&#xff08;-&a…

vue中组合式API和选项式API的区别

组合式api&#xff08;Composition API&#xff09;是vue3对我们开发者来说变化非常大的更新&#xff0c;我们先不关注具体语法&#xff0c;先对它有一个大的感知。 通过vue2, vue3两种形式实现同一个需求&#xff0c;理解vue3的compition api 带来的好处 两个独立的功能&…

leetcode 重复的子字符串

前要推理 以abababab为例&#xff0c;这里最主要的就是根据相等前后缀进行推导 s [ 0123 ] 如 t【 0123 】 f 【01 23 】 后两个分别是前后缀&#xff0c;第一个是总的字符串&#xff0c;然后可以推导 //首先还是算出…

从Spring Boot应用上下文获取Bean定义及理解其来源

前言 在Spring框架中&#xff0c;Bean是组成应用程序的核心单元。特别是在Spring Boot项目中&#xff0c;通过使用SpringApplication.run()方法启动应用后&#xff0c;我们可以获得一个ConfigurableApplicationContext实例&#xff0c;这个实例代表了整个应用程序的运行时环境…

ArcgisForJS如何使用ArcGIS Server发布的GP服务?

文章目录 0.引言1.ArcGIS创建GP服务2.ArcGIS Server发布GP服务3.ArcgisForJS使用ArcGIS Server发布的GP服务 0.引言 ArcGIS for JavaScript&#xff08;或简称AGJS&#xff09;是一个强大的工具&#xff0c;它允许开发者使用JavaScript在Web浏览器中创建和运行ArcGIS应用程序。…

Oracle 数据泵 导入导出 最简说明

数据泵可以对含有CLOB&#xff0c;BLOB等字段的表导出数据&#xff0c;是应用场景最广的一种导入导出方法&#xff0c;我觉得要比SQL Developer好用&#xff0c;不过需要能够登录数据库所在主机的操作系统。 导出 expdp paasapp/Paas1015 datafilemy_data.dmp content{ALL|DATA…

linux 的各种压缩文件命令

01-.tar格式 解包&#xff1a;[&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;]$ tar xvf FileName.tar 打包&#xff1a;[&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;]$ tar cvf FileN…

❤ git操作Github、git操作github

❤ 操作github 一、git操作Github 1、设置用户名和邮件地址 git config --global user.name "nexuslin" git config --global user.email "2455067339qq.com"2、生成本地密钥 ssh-keygen -t rsa -C 2455067339qq.com3、接下来就一直回车&#xff0c;然…

被后端五万条数据爆破我是怎么处理的

前言 今天面试的时候面试官直接问了一句后端一次性返回10万条数据给你&#xff0c;你如何处理&#xff1f;&#xff0c;我脑中浮现的第一句话就是拿着物理学圣剑找后端进行 “友好的协商”&#xff0c;谁打赢了听谁的。不过虽然这种情况很少&#xff0c;不过我在实际开发中还真…

Docker数据集与自定义镜像:构建高效容器的关键要素

目录 博客前言 一.数据卷 1.数据卷介绍 2.实战 宿主机和容器共享目录 容器和容器之间共享目录 二.自定义镜像 1.自定义镜像介绍 2.实战 2.1自定义centos&#xff0c;具备vim及ifconfig作用 构建镜像 通过镜像运行一个容器进行测试 2.2自定义tomact&#xff08;文件为…

(转载)SpringCloud 微服务(三)-Seata解决分布式事务问题

ps:这个原文写的很好&#xff0c;怕后续这个地址失效&#xff0c;备份一个留着自己学习 转自&#xff1a;SpringCloud 微服务&#xff08;三&#xff09;-Seata解决分布式事务问题_seata 黑马 代码-CSDN博客 看完了黑马程序员的免费课程&#xff0c;感觉受益匪浅&#xff0c;…

【Oracle】玩转Oracle数据库(七):RMAN恢复管理器

前言 嘿&#xff0c;数据库大魔法师们&#xff01;准备好迎接新的技术大招了吗&#xff1f;今天我们要探索的是Oracle数据库中的神奇利器——RMAN恢复管理器&#xff01;&#x1f6e1;️&#x1f4be; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;七&#xff09;&#xf…

Django 表单

用Django对用户提交的表单数据进行处理&#xff08;get方式&#xff09;。 search.py 文件代码&#xff1a; from django.http import HttpResponse from django.shortcuts import render # 表单 def search_form(request): return render(request, search_form.html) # …