题目链接

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 rede​dges.length<=400
  • b l u e e d g e s . l e n g t h < = 400 blue_edges.length <= 400 bluee​dges.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 rede​dges[i].length==bluee​dges[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 颜色交替的最短路径相关推荐

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

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

  2. leetcode 1129. 颜色交替的最短路径【BSF方法图解-python3实现过程详解】

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

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

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

  4. leetocde1129. 颜色交替的最短路径(bfs)

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

  5. LC1129. 颜色交替的最短路径

    BFS标记交替搜索法 def shortestAlternatingPaths(self, n, redEdges, blueEdges):""":type n: int ...

  6. DataGrid删除确认及Item颜色交替

    有时候我们需要在删除DataGrid中Item相对应的数据时,需要弹出一个确认对话框来提示使用者,其实这个功能非常简单,下面的代码可以在DataGrid的Item 中产生颜色交替的效果. privat ...

  7. html语言对奇偶数行设置颜色,纯CSS实现奇偶数行颜色交替(兼容主流浏览器)

    做一张li二倍高的背景图,然后,上半部分PS成奇数行颜色,下半部分PS成偶数行颜色,然后将这张图定义给ul任其平铺.这样一来,纵使有万千行,它也会轻而易举的交替颜色... 本文DEMO背景图(1*50 ...

  8. C++描述 LeetCode 5676. 生成交替二进制字符串的最少操作数

    C++描述 LeetCode 5676. 生成交替二进制字符串的最少操作数   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在C ...

  9. Axure 中继器表格背景颜色交替不成功

    一开始无论如何在样式中设置背景颜色交替始终不成功,百度了很多都没有找出原因: 后来终于找到原因了:此处的颜色透明度一定不能是100%,不然会将要设置的颜色覆盖掉,看不出变化. 成功:

最新文章

  1. 袁隆平院士在湖南农业大学新生典礼上的致辞
  2. Py之urllib2:Python库之urllib、urllib2、urllib3系列简介、安装、使用方法之详细攻略
  3. 【数据结构】量子危机
  4. 2021苏州大学计算机考研分数,苏州大学2021考研分数线已公布
  5. 动态规划_数字三角形
  6. linux lzo 压缩文件,Linux常用压缩和解压命令
  7. python人工智能入门优达视频_python入门视频教你搭建机器学习Python环境的正确姿势...
  8. 定期定量采购_采购的四种方法
  9. 动态规划C语言实现之最长公共子序列(LCS)
  10. 抓包工具tcpdump的使用总结(持续更新)
  11. office出错怎么简单修复
  12. Rockchip RK3588 MIPI-DSI2 详解
  13. IE浏览器设置默认显示版本
  14. 手机号,身份证号,姓名等校验
  15. HTML转图片或者HTML转PDF
  16. 【视频开发】【CUDA开发】ffmpeg nvenc编码
  17. 最新的服务器cpu有国产的吗,浪潮发布国产飞腾CPU服务器 已达业界主流水平
  18. 2017初秋最时髦服装搭配,裙子+短靴搭配
  19. 蓝桥杯 基础练习 分解质因数 C语言
  20. 访问Linux服务器新轮子WindTerm使用

热门文章

  1. 2.编写一元二次方程(ax2+bx+c=0)求根的程序: 输入3个系数(double型),输出:如果有2个实数根,那么输出2个实数根的值,如果只有一个根,那么输出这个根的值,如果没有实数根,那么输出一
  2. 微信小程序 运营的特性—模块化
  3. 【童晶老师《Python游戏趣味编程》在PyCharm中编辑】
  4. [译]PostgreSQL15改进了UNIQUE和NULL
  5. windows的nginx启动和停止
  6. 3篇SCI二区定A类博士, 免费120㎡住房+78万引进费+4500/月博士津贴,5年副教授待遇...
  7. IAP+APP程序拼接方法
  8. The road to the Vue(二)
  9. oracle复合索引列顺序,复合索引顺序选择性问题(一)
  10. 实验六:Wireshark网络抓包实验