Leetcode.1129 颜色交替的最短路径
题目链接
Leetcode.1129 颜色交替的最短路径 Rating : 1780
题目描述
在一个有向图中,节点分别标记为 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]
提示 :
- 1 < = n < = 100 1 <= n <= 100 1<=n<=100
- r e d e d g e s . l e n g t h < = 400 red_edges.length <= 400 rededges.length<=400
- b l u e e d g e s . l e n g t h < = 400 blue_edges.length <= 400 blueedges.length<=400
- r e d e d g e s [ i ] . l e n g t h = = b l u e e d g e s [ i ] . l e n g t h = = 2 red_edges[i].length == blue_edges[i].length == 2 rededges[i].length==blueedges[i].length==2
- 0 <= red_edges[i][j], blue_edges[i][j] < n
分析:
本题是求最短路径的长度,可以使用 BFS(BFS可以求最短路)。
我们用两个集合 g [ 0 ] 和 g [ 1 ] g[0] 和 g[1] g[0]和g[1] 分别代表 红色边集合 和 蓝色边集合。 0
代表红色,1
代表蓝色。因为 1 ^ 1 = 0 , 0 ^ 1 = 1
,这样可以快速的进行集合的交换。
一个记录答案的数组 ans
,开始全部初始化为 -1
。
队列里的元素有两个属性,分别是 点 和 颜色。比如当前点是 (3,0)
,那么下一个点 就应该在 g [ 1 ] g[1] g[1] 集合中,从点 3 出发的点。
还要有一个 st[2][n]
的数组,来记录已经搜过的状态,防止重复搜索。
开始之前队列中应该加入两个起点 (0,0)
和 (0,1)
,分别代表从零点出发,从蓝色边开始遍历 和 从红色边开始遍历。
时间复杂度: O ( n + m ) O(n + m) O(n+m)
C++代码:
class Solution {public:vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) {//g[0] 存放红色边,g[1] 存放蓝色边vector<vector<vector<int>>> g(2,vector<vector<int>>(n));for(auto &e:redEdges){int a = e[0],b = e[1];g[0][a].push_back(b);}for(auto &e:blueEdges){int a = e[0],b = e[1];g[1][a].push_back(b);}bool st[2][n];memset(st,false,sizeof st); //第一个参数是点 第二个参数是颜色queue<pair<int,int>> q;//起点 先从蓝色边开始遍历q.push({0,0});//起点 先从红色边开始遍历q.push({0,1});int step = 0;vector<int> res(n,-1);while(!q.empty()){int sz = q.size();for(int i = 0;i < sz;++i){auto [t,c] = q.front();q.pop();//如果 res[t] == -1,说明这个点是第一次访问,直接记录答案即可if(res[t] == -1) res[t] = step;//将当前状态记录下来,防止重复搜索st[c][t] = true;//交换颜色 0^1 = 1 , 1^1 = 0c ^= 1;for(auto &v:g[c][t]){if(!st[c][v]){q.push({v,c});}}}//没遍历完一层 路径长度+1step++;}return res;}
};
Java代码:
class Solution {public int[] shortestAlternatingPaths(int n, int[][] redEdges, int[][] blueEdges) {List<Integer>[][] g = new List[2][n];for (var f : g) {Arrays.setAll(f, k -> new ArrayList<>());}for (int[] e : redEdges) {int a = e[0];int b = e[1];g[0][a].add(b);}for (int[] e : blueEdges) {int a = e[0];int b = e[1];g[1][a].add(b);}Deque<int[]> q = new ArrayDeque<>();q.offer(new int[] {0, 0});q.offer(new int[] {0, 1});boolean[][] st = new boolean[2][n];int[] ans = new int[n];Arrays.fill(ans, -1);int step = 0;while (!q.isEmpty()) {int size = q.size();for (int i = 0;i < size;i++) {var p = q.poll();int t = p[0], c = p[1];if (ans[t] == -1) {ans[t] = step;}st[c][t] = true;c ^= 1;for (int v : g[c][t]) {if (!st[c][v]) {q.offer(new int[] {v, c});}}}++step;}return ans;}
}
Leetcode.1129 颜色交替的最短路径相关推荐
- LeetCode 1129. 颜色交替的最短路径(BFS)
文章目录 1. 题目 2. 解题 1. 题目 在一个有向图中,节点分别标记为 0, 1, ..., n-1. 这个图中的每条边不是红色就是蓝色,且存在自环或平行边. red_edges 中的每一个 [ ...
- leetcode 1129. 颜色交替的最短路径【BSF方法图解-python3实现过程详解】
题目 在一个有向图中,节点分别标记为 0, 1, -, n-1.图中每条边为红色或者蓝色,且存在自环或平行边. red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边 ...
- 1129. 颜色交替的最短路径
在一个有向图中,节点分别标记为 0, 1, -, n-1.图中每条边为红色或者蓝色,且存在自环或平行边. red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边.类似 ...
- leetocde1129. 颜色交替的最短路径(bfs)
在一个有向图中,节点分别标记为 0, 1, -, n-1.这个图中的每条边不是红色就是蓝色,且存在自环或平行边. red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向 ...
- LC1129. 颜色交替的最短路径
BFS标记交替搜索法 def shortestAlternatingPaths(self, n, redEdges, blueEdges):""":type n: int ...
- DataGrid删除确认及Item颜色交替
有时候我们需要在删除DataGrid中Item相对应的数据时,需要弹出一个确认对话框来提示使用者,其实这个功能非常简单,下面的代码可以在DataGrid的Item 中产生颜色交替的效果. privat ...
- html语言对奇偶数行设置颜色,纯CSS实现奇偶数行颜色交替(兼容主流浏览器)
做一张li二倍高的背景图,然后,上半部分PS成奇数行颜色,下半部分PS成偶数行颜色,然后将这张图定义给ul任其平铺.这样一来,纵使有万千行,它也会轻而易举的交替颜色... 本文DEMO背景图(1*50 ...
- C++描述 LeetCode 5676. 生成交替二进制字符串的最少操作数
C++描述 LeetCode 5676. 生成交替二进制字符串的最少操作数 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在C ...
- Axure 中继器表格背景颜色交替不成功
一开始无论如何在样式中设置背景颜色交替始终不成功,百度了很多都没有找出原因: 后来终于找到原因了:此处的颜色透明度一定不能是100%,不然会将要设置的颜色覆盖掉,看不出变化. 成功:
最新文章
- 袁隆平院士在湖南农业大学新生典礼上的致辞
- Py之urllib2:Python库之urllib、urllib2、urllib3系列简介、安装、使用方法之详细攻略
- 【数据结构】量子危机
- 2021苏州大学计算机考研分数,苏州大学2021考研分数线已公布
- 动态规划_数字三角形
- linux lzo 压缩文件,Linux常用压缩和解压命令
- python人工智能入门优达视频_python入门视频教你搭建机器学习Python环境的正确姿势...
- 定期定量采购_采购的四种方法
- 动态规划C语言实现之最长公共子序列(LCS)
- 抓包工具tcpdump的使用总结(持续更新)
- office出错怎么简单修复
- Rockchip RK3588 MIPI-DSI2 详解
- IE浏览器设置默认显示版本
- 手机号,身份证号,姓名等校验
- HTML转图片或者HTML转PDF
- 【视频开发】【CUDA开发】ffmpeg nvenc编码
- 最新的服务器cpu有国产的吗,浪潮发布国产飞腾CPU服务器 已达业界主流水平
- 2017初秋最时髦服装搭配,裙子+短靴搭配
- 蓝桥杯 基础练习 分解质因数 C语言
- 访问Linux服务器新轮子WindTerm使用
热门文章
- 2.编写一元二次方程(ax2+bx+c=0)求根的程序: 输入3个系数(double型),输出:如果有2个实数根,那么输出2个实数根的值,如果只有一个根,那么输出这个根的值,如果没有实数根,那么输出一
- 微信小程序 运营的特性—模块化
- 【童晶老师《Python游戏趣味编程》在PyCharm中编辑】
- [译]PostgreSQL15改进了UNIQUE和NULL
- windows的nginx启动和停止
- 3篇SCI二区定A类博士, 免费120㎡住房+78万引进费+4500/月博士津贴,5年副教授待遇...
- IAP+APP程序拼接方法
- The road to the Vue(二)
- oracle复合索引列顺序,复合索引顺序选择性问题(一)
- 实验六:Wireshark网络抓包实验