博客
关于我
1129 颜色交替的最短路径(dfs)
阅读量:364 次
发布时间:2019-03-04

本文共 2403 字,大约阅读时间需要 8 分钟。

1. 问题描述:

在一个有向图中,节点分别标记为 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。

示例 1:

输入:n = 3, red_edges = [[0,1],[1,2]], blue_edges = []

输出:[0,1,-1]

示例 2:

输入:n = 3, red_edges = [[0,1]], blue_edges = [[2,1]]

输出:[0,1,-1]

示例 3:

输入:n = 3, red_edges = [[1,0]], blue_edges = [[2,1]]

输出:[0,-1,-1]

示例 4:

输入:n = 3, red_edges = [[0,1]], blue_edges = [[1,2]]

输出:[0,1,2]

示例 5:

输入:n = 3, red_edges = [[0,1],[0,2]], blue_edges = [[1,0]]

输出:[0,1,1]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/shortest-path-with-alternating-colors

2. 思路分析:

① 这道题目有一个比较明显的特点是需要尝试才能够知道最终的答案,并且还是一个图论的问题所以可以使用dfs搜索来解决,但是怎么样去处理搜索的细节是一个需要思考的问题,因为是红蓝交替出现的所以感觉处理起来还是需要一定的技巧的,在领扣的题解中发现一个比较好的处理搜索细节的方法,使用的是c++代码编写的,我自己理解之后使用了python语言进行解决,下面是我对于大佬的代码的一些理解

② 比较核心的是使用一个二维列表记录中间的结果,第一维表示的是当前的顶点,第二维表示的是颜色,0表示红色,1表示蓝色,在递归的过程中需要交替递归不同颜色的路径这样才可以表示红蓝交替出现的路径,所以可以使用一个三维的列表来表示题目中给出的红色路径与蓝色路径表示的图,我们在递归的时候可以传入当前递归的颜色,往下递归的时候就可以根据传入的颜色来决定往下递归的是哪一种颜色的路径,在递归的dfs方法中比较核心的是下面的if判断:

这个可以自己在图上画一下具体的例子来理解会更好一点

③ 在dfs搜索的过程中,需要使用下标也就是当前的顶点来进行递归的,这里可以使用collections.defaultdict(list)创建字典的形式来存储图,这样在递归的时候可以直接使用下标进行访问

3. 代码如下:

import collectionsimport sysfrom typing import Listclass Solution:    def dfs(self, graph: List[List[List[int]]], color: int, res: List[List[int]], cur: int):        # 可以使用异或操作来表示0还是1        for i in graph[color][cur]:            if res[cur][color] + 1 < res[i][color ^ 1]:                res[i][color ^ 1] = res[cur][color] + 1                self.dfs(graph, color ^ 1, res, i)    def shortestAlternatingPaths(self, n: int, red_edges: List[List[int]], blue_edges: List[List[int]]) -> List[int]:        # 初始化能够使用下标来访问的红色和蓝色的有向图        rg, bg = collections.defaultdict(list), collections.defaultdict(list)        for cur in red_edges:            rg[cur[0]].append(cur[1])        for cur in blue_edges:            bg[cur[0]].append(cur[1])        graph = list()        graph.append(rg)        graph.append(bg)        res = [[sys.maxsize] * 2 for i in range(n)]        res[0][0], res[0][1] = 0, 0        self.dfs(graph, 0, res, 0)        self.dfs(graph, 1, res, 0)        ans = [0 for i in range(n)]        for i in range(n):            ans[i] = min(res[i][0], res[i][1])            if ans[i] == sys.maxsize:                ans[i] = -1        return ans

 

转载地址:http://vagr.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>