leetcode 1129. 颜色交替的最短路径【BSF方法图解-python3实现过程详解】
题目
在一个有向图中,节点分别标记为 0, 1, …, n-1。图中每条边为红色或者蓝色,且存在自环或平行边。
red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。类似地,blue_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的蓝色有向边。
返回长度为 n 的数组 answer,其中 answer[X] 是从节点 0 到节点 X 的红色边和蓝色边交替出现的最短路径的长度。如果不存在这样的路径,那么 answer[x] = -1。
示例
- 输入:n = 5, red_edges = [[0,1],[0,2],[2,3]], blue_edges = [[1,2],[3,4]]
- 输出:[0,1,-1]
题解
这个题目其实方法很容易确定,由于有颜色的交替,因此想到广度优先是很自然的事情。一图胜前言,还是用图说话比较清晰。
上图是一个广度优先遍历的过程,过程比较简单,从初始节点0开始根据交替变幻边的颜色来实现广度优先遍历。下面我们如何实践这个过程来得到最终结果呢?
首先面临的一个问题就是边的表示问题,这里边包含的信息量较多,有源节点,目的节点与颜色。直接用三元组表示不是特别方便,这里城根据源节点找到这些边,hash表是个不错的选择,但这里可更简化一下把源节点作为列表的索引,就剩下目的节点与颜色二元组了。
比如上图中的节点0到1的边可以表示成下面的列表形式,源节点0对应列表中的第0个元素,该元素中的第1个值表示目标节点,第二个值表示边的颜色。
到这里基本上就可以写代码了,代码整理如下:
class Solution:def shortestAlternatingPaths(self, n: int, redEdges: List[List[int]], blueEdges: List[List[int]]) -> List[int]:#构建图,图列表的索引表示g=[[] for _ in range(n)]for s,t in redEdges:g[s].append((t,0))for s,t in blueEdges:g[s].append((t,1))dis=[-1]*n#已遍历过的,由0到0开始,0到0的颜色两种均可加上不会对结构有影响vis={(0,0),(0,1)}#广度优先第一层节点初始化q=[(0,0),(0,1)]level=0while q:next_q=[]for x,color in q:if dis[x]==-1:dis[x]=level#遍历q中的x节点的下一跳for p in g[x]:if p[1]!=color and p not in vis:vis.add(p)next_q.append(p)q=next_qlevel+=1return dis
计算复杂
- 时间复杂度:O(n+r+b)O(n+r+b)O(n+r+b),其中 nnn 是节点数,r 是红色边的数目,b是蓝色边的数目。广度优先搜索最多访问一个节点两次,最多访问一条边一次,因此时间复杂度为 O(n+r+b)O(n+r+b)O(n+r+b)。
- 空间复杂度:O(n+r+b)O(n+r+b)O(n+r+b)。队列中最多有 2n个元素,保存 next 需要 O(n+r+b)O(n+r+b)O(n+r+b)的空间,保存 dist需要O(n)O(n)O(n) 的空间。
leetcode 1129. 颜色交替的最短路径【BSF方法图解-python3实现过程详解】相关推荐
- Leetcode.1129 颜色交替的最短路径
题目链接 Leetcode.1129 颜色交替的最短路径 Rating : 1780 题目描述 在一个有向图中,节点分别标记为 0, 1, ..., n-1.图中每条边为红色或者蓝色,且存在自环或平行 ...
- LeetCode 1129. 颜色交替的最短路径(BFS)
文章目录 1. 题目 2. 解题 1. 题目 在一个有向图中,节点分别标记为 0, 1, ..., n-1. 这个图中的每条边不是红色就是蓝色,且存在自环或平行边. red_edges 中的每一个 [ ...
- 1129. 颜色交替的最短路径
在一个有向图中,节点分别标记为 0, 1, -, n-1.图中每条边为红色或者蓝色,且存在自环或平行边. red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边.类似 ...
- java word 颜色设置_通过Java设置Word页面背景色过程详解
前言 Word中可以针对不同文档排版设计要求来设置背景设置颜色.常见的可设置单一颜色.渐变色或加载图片来设置成背景.下面通过Java来设置以上3种Word页面背景色. 使用工具:Spire.Doc f ...
- python中docx模块的使用_python使用docx模块读写docx文件的方法与docx模块常用方法详解...
一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象 ...
- hp打印机没有右键扫描_安装HP打印机报错 0x000006be解决方法,图文操作步骤详解...
安装HP打印机报错 0x000006be解决方法,图文操作步骤详解 1. 首先打开控制面板 2.在程序和功能窗口中找是否有HP的打印机驱动,卸载掉 3.打开C:WindowsSystem32spool ...
- java8 方法引用详解_Java8中如何通过方法引用获取属性名详解
前言 在我们开发过程中常常有一个需求,就是要知道实体类中Getter方法对应的属性名称(Field Name),例如实体类属性到数据库字段的映射,我们常常是硬编码指定 属性名,这种硬编码有两个缺点. ...
- 三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解
三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解 本次以FX3U系列PLC的模拟量输入模块FX3U-4AD进行举例说明: 该模块的部分技术数据如下图所示, 该模块的接线端子排列 ...
- 计算机辅助药物设计的一般原理,朱瑞新着--_计算机辅助药物设计(Ⅰ)--基本方法原理概要与实践详解.pdf...
文档介绍: 计算机辅助药物设计 ------ 基本方法原理概要与实践详解作者朱瑞新 2011 年 1 月目录序前言第一章"计算机辅助药物设计"与 M OE 概貌一.导言二.&quo ...
最新文章
- MongoDB的备份(mongodump)与恢复(mongorestore)
- Ubuntu搭建Spark运行环境
- shell脚本练习(12.8)
- 陶哲轩实分析习题8.5.15
- asp远程访问sql server数据库
- 如何快速高效的群发Email
- 传智播客java课程表,先睹为快
- 使用ETest实现汽车ECU的HIL测试
- php函数-wordwrap,sprintf,ucwords,ucfirst,substr_replace
- java和美利达_JAVA、GIANT、MERIDA、UCC四大厂商破风铝架横评
- uci2019计算机录取,美国加州大学这九所分校2019最新录取数据
- linux环境操作PPT转图片总结
- 体现中文编程独有特点的一些探索
- Holy Grail————计蒜客
- 关于哈密顿路是否存在的遍历算法
- 探索人群客单价差异的显著性,使用SPSS就能轻松做到
- 基于JAVA springboot + MYSQL +VUE的项目管理系统(含数据库),包括工时统计、原型预览、效果图管理等
- 【c#】DGV中复制粘贴数据最详细代码
- 2023年北京师范大学应用统计考研上岸前辈备考经验指导
- linux下安装python3出现无configure_Linux下安装Python3.9.0
热门文章
- 卡尔曼滤波五个公式各个参数的意义
- 批量查询接口如何巧妙利用单查询接口中的@Cacheable
- 金条切割问题(java实现)
- 【复变函数与积分变换】03. 复变函数的积分
- AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能
- linux下db2导入csv文件脚本,从文件csv导入db2(db2 import from file csv)
- php 分页page
- 【机器学习】多项式回归案例四:员工职位与薪回归模型分析
- 电磁场与电磁波实验一 熟悉Matlab软件在电磁场领域的应用
- while ... Wend循环语句的用法