【每日一题】重新规划路线

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:深度优先搜索
    • 方法二:广度优先搜索
  • 写在最后

Tag

【深搜】【广搜】【树】【2023-12-07】


题目来源

1466. 重新规划路线


题目解读

题目给定一张由 n个点(使用 0 到 n−1 编号),n−1 条边构成的有向图,如果忽略边的方向,就变成了一棵树。我们需要改变某些边的方向使得每个点都可以访问到 0 号点。


解题思路

今天是此类有向/无向图问题的第三天,前两天都是无向图的问题,今天看似是有向图的问题,实则是无向图的问题。

如果忽略边的方向,将每条有向边及其反向边加入到图中,那么从任意一点出发都能到达 0 号点。路径上可能会经过反向边,我们需要变更与之对应的原边的方向。需要变更的次数即为答案。

以每个点为起点进行搜索的代价会很大,因此我们考虑从 0 出发去遍历其他点,原来我们需要统计反向边的数量,现在需要统计原方向边的数量。

从 0 出发去遍历其他点有两种方法:

  • 深度优先搜索;
  • 广度优先搜索。

方法一:深度优先搜索

思路

在开始深度优先搜索之前,先根据数组 connections 建立无向图,使用 1 标记原方向的边,用 0 标记反向边。

从 0 开始遍历,访问到某个新的点时,所经过的边被标记为 1 时,就令答案加 1。最终统计得到的答案就是我们需要变更方向的最小路线数。

算法

从编号 0 开始,递归计算需要修改的边数。

class Solution {
public:int minReorder(int n, vector<vector<int>>& connections) {// 建图vector<vector<pair<int, int>>> g(n);for (auto connection : connections) {int x = connection[0], y = connection[1];g[x].push_back(make_pair(y, 1));g[y].push_back(make_pair(x, 0));}function<int(int, int)> dfs = [&](int x, int pa) {int res = 0;for (auto y : g[x]) {if (y.first != pa) {res += y.second + dfs(y.first, x);}}return res;};return dfs(0, -1);}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n),建图的时间复杂度为 O ( n ) O(n) O(n),深搜的时间复杂度也是。

空间复杂度: O ( n ) O(n) O(n),最坏情况下树退化成一条链,所需栈空间为 O ( n ) O(n) O(n)

方法二:广度优先搜索

深搜与广搜比较

广度优先搜索与深度优先搜索解题思路一致,都是从节点 0 出发统计到其他节点的反边的数量。深搜是利用递归的方法计算,广搜则利用迭代的方法计算。

深搜中为了保证从 0 向其他节点搜索,给出了 y.first != pa 的限制。广搜中为了防止节点被重复计算,使用了一个数组 vis 来标记已经访问过的节点。

算法

class Solution {
public:int minReorder(int n, vector<vector<int>>& connections) {// 建图vector<vector<pair<int, int>>> g(n);for (auto connection : connections) {int x = connection[0], y = connection[1];g[x].push_back(make_pair(y, 1));g[y].push_back(make_pair(x, 0));}int res = 0;vector<int> vis(n);     // 标记节点是否被访问过queue<int> q;q.push(0);vis[0] = 1;while (!q.empty()) {int x = q.front();q.pop();for (auto y : g[x]) {if (vis[y.first] == 0) {res += y.second;q.push(y.first);vis[y.first] = 1;}}}return res;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n),建图的时间复杂度为 O ( n ) O(n) O(n),广搜的最坏时间复杂度也是。

空间复杂度: O ( n ) O(n) O(n)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

C++ 函数详解

目录 函数概述 函数的分类 函数的参数 函数的调用 函数的嵌套调用 函数的链式访问 函数声明和定义 函数递归 函数概述 函数——具有某种功能的代码块。 一个程序中我们经常会用到某种功能&#xff0c;如两数相加&#xff0c;如果每次都在需要用到时实现&#xff0c;那…

【Java系列】函数式接口编程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何使用Docker本地搭建开源CMF Drupal并结合内网穿透公网访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

业绩超预期,股价却暴跌,MongoDB股票还值得投资吗?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 尽管MongoDB(MDB)本季度的财报超出了预期&#xff0c;并提高了全年预期&#xff0c;但它的股价在财报发布后还是出现了暴跌。 MongoDB截至2023年10月31日的第三财季&#xff0c;收入同比增长了30%&#xff0c;达到了4.329亿…

HXDSP2441-地址空间转换

地址空间转换 地址空间本身很简单&#xff0c;但由于HXDSP2441同时有DSP核和CPU核&#xff0c;且二者寻址方式不同&#xff0c;导致编程中会有歧义。 DSP核采用字地址编址方式&#xff0c;CPU核和总线空间内都采用字节地址编址方式&#xff0c;而且文档中所涉及的所有寄存器地…

选择更好的Notes索引附件方式

大家好&#xff0c;才是真的好。 首先介绍最近产品更新消息。在上一周&#xff0c;HCL主要发布了以下几个产品更新&#xff1a;HCL Verse 3.2.0、HCL Volt MX Go 2.0.2、HCL Domino Rest API 1.0.8。 HCL Verse是今后Domino的产品当中主要使用的webmail功能&#xff0c;这一次…

【数据结构】手撕排序

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、排序的概念及其运用1.1 排序的概念1.2 常见的算法排序 二、 冒泡排序三、直接插入排…

考试与评价杂志考试与评价杂志社考试与评价编辑部2023年第11期目录

直击中高考 新高考背景下高中英语复习优化教学策略 何永翠1-3 中考英语阅读试题分析与备考策略 乔思4-6《考试与评价》投稿&#xff1a;cn7kantougao163.com 基于中考视角 优化词汇复习 郑敏婧7-9 以教促考 初中英语主谓一致三原则解析 龚海仙10-12 初中英语教育中的口语交流能…

AI交互数字人如何创新文旅景区新体验?

在数实融合技术推动以及国家文化数字化战略的深入实施&#xff0c;文旅产业逐渐融入AI交互数字人技术&#xff0c;通过在文旅景区布局AI交互数字人&#xff0c;以此为数字文旅带来了更多活力和可能。 *图片源于网络 如江西南昌滕王阁基于南昌市提升旅游城市地位并扩大影响的需求…

RHEL8---vim编辑器的使用

本章主要介绍如何使用vim编辑文件 vim 的基本使用vim 几种模式的切换vim 在末行模式中的用法vim 在命令模式中的用法 在Linux中&#xff0c;很多时候需要使用编辑器来修改文件&#xff0c;使用最多的编辑器就是vim,用法如下。 vim /path/file 如果这个文件不存在&#xff0c;…

读者和写者问题

它可以解决的问题&#xff1a; 可以支持多个读者访问&#xff0c;通过count计数 来实现多个读者访问的时候是互斥的&#xff0c;不会出现不符合进程同步的问题&#xff1a;设置mutex互斥锁&#xff0c;保证count或count--和if Pv(mutex)是一气呵成的 读写公平&#xff0c;通过…

elk(filebeat)日志收集工具

elk&#xff08;filebeat&#xff09;日志收集工具 elk&#xff1a;filebeat日志收集工具 和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境。他可以代理logstash在…