题目

在一个有向图中,节点分别标记为 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实现过程详解】相关推荐

  1. Leetcode.1129 颜色交替的最短路径

    题目链接 Leetcode.1129 颜色交替的最短路径 Rating : 1780 题目描述 在一个有向图中,节点分别标记为 0, 1, ..., n-1.图中每条边为红色或者蓝色,且存在自环或平行 ...

  2. LeetCode 1129. 颜色交替的最短路径(BFS)

    文章目录 1. 题目 2. 解题 1. 题目 在一个有向图中,节点分别标记为 0, 1, ..., n-1. 这个图中的每条边不是红色就是蓝色,且存在自环或平行边. red_edges 中的每一个 [ ...

  3. 1129. 颜色交替的最短路径

    在一个有向图中,节点分别标记为 0, 1, -, n-1.图中每条边为红色或者蓝色,且存在自环或平行边. red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边.类似 ...

  4. java word 颜色设置_通过Java设置Word页面背景色过程详解

    前言 Word中可以针对不同文档排版设计要求来设置背景设置颜色.常见的可设置单一颜色.渐变色或加载图片来设置成背景.下面通过Java来设置以上3种Word页面背景色. 使用工具:Spire.Doc f ...

  5. python中docx模块的使用_python使用docx模块读写docx文件的方法与docx模块常用方法详解...

    一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象 ...

  6. hp打印机没有右键扫描_安装HP打印机报错 0x000006be解决方法,图文操作步骤详解...

    安装HP打印机报错 0x000006be解决方法,图文操作步骤详解 1. 首先打开控制面板 2.在程序和功能窗口中找是否有HP的打印机驱动,卸载掉 3.打开C:WindowsSystem32spool ...

  7. java8 方法引用详解_Java8中如何通过方法引用获取属性名详解

    前言 在我们开发过程中常常有一个需求,就是要知道实体类中Getter方法对应的属性名称(Field Name),例如实体类属性到数据库字段的映射,我们常常是硬编码指定 属性名,这种硬编码有两个缺点. ...

  8. 三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解

    三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解 本次以FX3U系列PLC的模拟量输入模块FX3U-4AD进行举例说明:  该模块的部分技术数据如下图所示,  该模块的接线端子排列 ...

  9. 计算机辅助药物设计的一般原理,朱瑞新着--_计算机辅助药物设计(Ⅰ)--基本方法原理概要与实践详解.pdf...

    文档介绍: 计算机辅助药物设计 ------ 基本方法原理概要与实践详解作者朱瑞新 2011 年 1 月目录序前言第一章"计算机辅助药物设计"与 M OE 概貌一.导言二.&quo ...

最新文章

  1. MongoDB的备份(mongodump)与恢复(mongorestore)
  2. Ubuntu搭建Spark运行环境
  3. shell脚本练习(12.8)
  4. 陶哲轩实分析习题8.5.15
  5. asp远程访问sql server数据库
  6. 如何快速高效的群发Email
  7. 传智播客java课程表,先睹为快
  8. 使用ETest实现汽车ECU的HIL测试
  9. php函数-wordwrap,sprintf,ucwords,ucfirst,substr_replace
  10. java和美利达_JAVA、GIANT、MERIDA、UCC四大厂商破风铝架横评
  11. uci2019计算机录取,美国加州大学这九所分校2019最新录取数据
  12. linux环境操作PPT转图片总结
  13. 体现中文编程独有特点的一些探索
  14. Holy Grail————计蒜客
  15. 关于哈密顿路是否存在的遍历算法
  16. 探索人群客单价差异的显著性,使用SPSS就能轻松做到
  17. 基于JAVA springboot + MYSQL +VUE的项目管理系统(含数据库),包括工时统计、原型预览、效果图管理等
  18. 【c#】DGV中复制粘贴数据最详细代码
  19. 2023年北京师范大学应用统计考研上岸前辈备考经验指导
  20. linux下安装python3出现无configure_Linux下安装Python3.9.0

热门文章

  1. 卡尔曼滤波五个公式各个参数的意义
  2. 批量查询接口如何巧妙利用单查询接口中的@Cacheable
  3. 金条切割问题(java实现)
  4. 【复变函数与积分变换】03. 复变函数的积分
  5. AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能
  6. linux下db2导入csv文件脚本,从文件csv导入db2(db2 import from file csv)
  7. php 分页page
  8. 【机器学习】多项式回归案例四:员工职位与薪回归模型分析
  9. 电磁场与电磁波实验一 熟悉Matlab软件在电磁场领域的应用
  10. while ... Wend循环语句的用法