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

文章目录

  • 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)


写在最后

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux查看命令的绝对路径

linux查看命令的绝对路径 在Linux中&#xff0c;可以使用以下命令来查看命令的绝对路径&#xff1a; 1、which 命令名 例如&#xff0c;要查看chronyc命令的绝对路径&#xff0c;可以运行&#xff1a; which chronyc 2、whereis 命令名 例如&#xff0c;要查看chronyc命令…

好单库无代码API集成:广告推广与营销系统的高效电商平台连接方式

电商平台与无代码API集成的协同效应 随着数字化浪潮的不断推进&#xff0c;电子商务的生态正在快速演变。在这个过程中&#xff0c;电商平台的实时数据同步和高效运营对于保持竞争力至关重要。好单库作为电商领域的一大创新&#xff0c;提供了无需编程的API集成解决方案&#…

lv11 嵌入式开发 IIC(上) 19

目录 1 IIC总线简介 1.1 串行、半双工&#xff08;同时只能1收或者1发&#xff09; 1.2 IIC总线通信过程 2 IIC总线信号实现 2.1 IIC总线寻址方式 2.2 起始信号和停止信号 2.3 字节传送与应答 2.4 同步信号 2.5 典型IIC时序 3 练习 1 IIC总线简介 1.1 串行、半双工&a…

6.1 U-boot的使用

由于Ubuntu出现了一些问题&#xff0c;后面都是使用正点原子官方版本。 一、U-boot使用 1. U-boot源码 Linux 系统要启动需要通过 bootloader 程序引导&#xff0c;也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设&#xff0c;然后…

77. 组合

组合 描述 : 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 题目 : LeetCode 77. 组合 : 77. 组合 分析 : 请看回溯怎么回事 , 里面讲的很清晰 . 解析 ; class Solution {public List<List<Integ…

看图学源码之 CopyOnWriteArrayList 源码分析

基本简介&#xff1a; 是Java中的一个线程安全的List实现&#xff0c;也是ArrayList 的安全版本&#xff0c;所以就不会有ArrayList 的并发修改异常 的问题产生了 原理 每次在对 List 进行修改时&#xff0c;创建一个新的副本&#xff08;即拷贝&#xff09;&#xff0c;而不…

Agility Robotics 为亚马逊仓库批量生产的人形机器人

一家旨在每年生产 10000 个两足机器人的革命性工厂即将在俄勒冈州塞勒姆成形。 这些机器人由 Agility Robotics 开发&#xff0c;旨在协助亚马逊等行业巨头运输、起重和处理危险货物。 Agility Robotics 表示&#xff0c;其名为 RoboFab 的新制造工厂将成为世界上第一个大规模…

【计算机网络笔记】物理层——频带传输基础

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

Linux_CentOS_7.9 VNC安装卸载以及相关配置开机自启动服务简易记录

VNC安装卸载以及相关配置开机自启动服务&#xff1a; 查看环境&#xff1a;&#xff08;yum镜像源配置可以参考我之前文章里面有详细参考http://t.csdnimg.cn/mzGoI&#xff09; [rootorcl238 ~]# rpm -qa | grep vnc ##查看系统现有VNC软件版本 gtk-vnc2-0.7.0-3.el7.x86…

2023年5个自动化EDA库推荐

EDA或探索性数据分析是一项耗时的工作&#xff0c;但是由于EDA是不可避免的&#xff0c;所以Python出现了很多自动化库来减少执行分析所需的时间。EDA的主要目标不是制作花哨的图形或创建彩色的图形&#xff0c;而是获得对数据集的理解&#xff0c;并获得对变量之间的分布和相关…

深圳锐杰金融:用金融力量守护社区健康

深圳市锐杰金融投资有限公司&#xff0c;作为中国经济特区的中流砥柱&#xff0c;近年来以其杰出的金融成绩和坚定的社会责任立场引人注目。然而&#xff0c;这并非一个寻常的金融机构。锐杰金融正在用自己的方式诠释企业责任和慈善精神&#xff0c;通过一系列独特的慈善项目&a…

Matlab 用矩阵画图

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 概要Chap.III 杂记 Part.II 用矩阵画图Chap.I 摸索过程Chap.II 绘制专业图Chap.III 矩阵转tiff Part.I Introduction 本文汇总了 Matlab 用矩阵画图的几种方式。 Chap.I 预备知识 关于 *.mat 文件 *.mat文件是 matlab 的…

Java UDP 多人聊天室简易版

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

什么是类加载器?什么是双亲委派模型?

什么是类加载器&#xff0c;类加载器有哪些? 要想理解类加载器的话&#xff0c;务必要先清楚对于一个Java文件&#xff0c;它从编译到执行的整个过程。 类加载器&#xff1a;用于装载字节码文件(.class文件) 运行时数据区&#xff1a;用于分配存储空间 执行引擎&#xff1a;执…

Unity中Batching优化的GPU实例化(2)

文章目录 前言一、GPU实例化的Shader准备步骤1、在Pass中声明实例化需要的变体2、UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID). 前言 在上篇文章中&#xff0c;我们做了一些GPU实例化的前置准备&…

【OJ比赛日历】快周末了,不来一场比赛吗? #12.09-12.15 #14场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-12-09&#xff08;周六&#xff09; #7场比赛2023-12-10…

CodeSys学习笔记

文章目录 1.运动控制的两种方式1.1.SM3_CNC1.2.SM3_Robotics 2.两种运动控制方式的速度、加速度等参数的控制2.1.SM3_CNC2.2.SM3_Robotics 3.CNC的M指令的使用&#xff08;实现&#xff09;逻辑。4.SM3_Robotics中的坐标系5.SM3_Robotics如何实现插补并连续执行&#xff1f; 记…

程序管理与SELinux初探-理论篇

工作管理概念&#xff08;job control&#xff09; 1前台&#xff1a;你可以控制与执行命令的这个环境称为前台 2后台&#xff1a;可以自行运行的工作&#xff0c;你无法ctrlc终止它&#xff0c;可以使用bg/fg调用该工作 3后台中执行的进程不能等待terminal/shell的输入 sui…

MySQL高级--01_1--数据库缓冲池(buffer pool)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 数据库缓冲池(buffer pool)DBMS 会申请占用内存来作为数据缓冲池&#xff0c;在真正访问页面之前&#xff0c;需要把在磁盘上的页缓存到内存中的Buffer Pool 之后才…

【已解决】ImportError: cannot import name ‘Merge‘ from ‘keras.layers‘

问题描述 ImportError: cannot import name ‘Merge‘ from ‘keras.layers‘ 解决办法 1、tensorflow和keras版本要对应&#xff1b; 2、使用"merge" pip uninstall keras pip install keras2.3.1 from keras.layers import merge完结撒花 我这血中带泪的成长&…