【最短路径--BFS】1129. 颜色交替的最短路径

【C++图论 BFS1129. 颜色交替最短路径|1779 给定一个整数 n,即有向图中的节点数,其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges,其中: redEdges[i] = [ai, bi] 表示图中存在一条从节点 ai 到节点 bi 的红色有向边, blueEdges[j] = [uj, vj] 表示图中存在一条从节点 uj 到节点 vj 的蓝色有向边。 返回长度为 n 的数组 answer,其中 answer[X] 是从节点 0 到节点 X 的红色边和蓝色 阅读详情

题目描述

(中等)在一个有向图中,节点分别标记为 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 = 3, red_edges = [[0,1],[0,2]], blue_edges = [[1,0]]
输出:[0,1,1]

解题思路

单源最短路径问题,第一想法就是广度优先与Dijkstra算法。考虑到无权图,选择实现起来相对容易的广度优先算法。
相较于经典的最短路径问题,本题的难点在于如何高效的判断结点的重复访问(下文以去重代称)。传统的BFS去重可以借助dis[]数组(例如,初始化为-1,不为-1时表示该结点已找到最短路)或visited[]数组。但本题考虑到颜色交替这一特性,可能存在以不同颜色“重复” 访问某一结点后,可以到达原本无法到达的“目标”结点。
因此,只需在维护访问记录时增加color属性,即红/蓝色的访问分开维护。红色记为 ‘0’,蓝色记为 ‘1’。 介绍完整体思路后,代码细节如下。

代码实现

class Solution {
public:
    vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) {
        //创建邻接链表,相当于索引,节省检索效率。
        vector<vector<pair<int,int>>> graph(n);
        for(auto edge : redEdges){
            graph[edge[0]].push_back({edge[1], 0});
        }
        for(auto edge : blueEdges){
            graph[edge[0]].push_back({edge[1], 1});
        }
        //初始化最短距离
        vector<int> dis(n, -1);
        //visited数组,第二维:下标0为红,1为蓝
        vector<vector<bool>> visited(n, vector<bool>(2));
        //0结点作为起点,拥有红蓝所有权限
        visited[0] = {true, true};
        //初始化最短距离
        int distance = 0;
        //起点的最短距离为0
        dis[0] = distance;
        //创建队列,起点入队,开始遍历graph
        queue<pair<int, int>> que;
        //[弧头(有向边起点),颜色(0--红, 1 -- 蓝, 2 -- all)]
        que.push({0, 2});
        while(!que.empty()){
            int size = que.size();
            //新的”一层“,距离 + 1
            distance++;
            while(size--){
                auto node = que.front();
                que.pop();
                //遍历以当前结点为起点的所有边
                for(auto edge : graph[node.first]){
                	//满足颜色交替 && 尚未以次颜色访问结点,边的终点入队
                    if(node.second != edge.second && !visited[edge.first][edge.second]){
                        //维护访问记录visited[当前边的终点(弧尾)][颜色]
                        visited[edge.first][edge.second] = true;
                        que.push({edge.first, edge.second});
                        //dis数组尚未修改过,即为首次访问,亦表示最短到达!
                        if(dis[edge.first] == -1) dis[edge.first] = distance;
                    }
                }
            }
        }
        //直到队列为空返回答案!
        return dis;
    }
};

运行结果:
运行结果

1129. 颜色交替最短路径 对于某一个队列元素,节点编号为 x,节点路径类型为 t,那么根据类型 t 选择颜色为 1 − t 的相邻有向边,如果有向边的终点节点 y 对应类型 1 − t 没有被访问过,那么更新节点 y 的类型 1 − t 的颜色交替最短路径的长度为节点 x 的类型 t 的颜色交替最短路径的长度加 1,并且将它入队。类似地,如果存在从节点 0 到节点 x 的类型 1 的颜色交替路径,并且从节点 x 到节点 y 的有向边为红色,那么该路径加上该有向边组成了从节点 0 到节点 y 的类型 0 的颜色交替路径。 阅读详情

相关推荐

BFS题:颜色交替最短路径

BFS题:颜色交替最短路径 问题: 思路: 颜色交替的解决办法: 我们每次传递时,将上一次遍历的边的颜色信息带上,在下一次遍历时,选择不同的颜色的邻接节点,节点信息在队列中的存储为(node,color),即既存储节点的编号,又存储上一次遍历边的颜色信息 由于存在环和平行边,使用数组visit[x][y][color] = 1,代表从节点x到节点y的且颜色为color的边被访问过,防止重复访问。 对红色和蓝色边分别使用map建立邻接表,初始放入队列的信息为(0,1)和(0,0),分别表示从起点开始,下

qq_44709990的博客 431

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

leetcode笔记

闯入网络安全的数据分析小白 843

【LeetCode】1129. 颜色交替最短路径

LeetCode

Keikei419的博客 314

每天一道leetcode:1129. 颜色交替最短路径图论&中等&广度优先遍历)

今日份题目:1129. 颜色交替最短路径图论&中等&广度优先遍历)

qq_63349644的博客 2064

leetcode1129. 颜色交替最短路径/单源最短路径BFS,DFS

文章目录标题:leetcode1129. 颜色交替最短路径基本思想1:BFS基本思想2:dfs深度分析 标题:leetcode1129. 颜色交替最短路径 在一个有向图中,节点分别标记为 0, 1, …, n-1。这个图中的每条边不是红色就是蓝色,且存在自环或平行边。 red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。类似地,blue_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的蓝色有向边。 返回长度为 n 的数组 answer,其中 a

yyf_blog 848

Leetcode 1129. 颜色交替最短路径 BFS+模拟

【代码】Leetcode 1129. 颜色交替最短路径 BFS+模拟。

想买很多漂亮衣服但是买不起的博客 237

LeetCode 1129. 颜色交替最短路径BFS

文章目录1. 题目2. 解题 1. 题目 在一个有向图中,节点分别标记为 0, 1, ..., n-1。 这个图中的每条边不是红色就是蓝色,且存在自环或平行边。 red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。 类似地,blue_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的蓝色有向边。 返回长度为 n 的数组 answer,其中 answer[X] 是从节点 0 到节点 X 的红色边和蓝色边交替出现的最短路径的长度。 如果不存在这样的路径,

Michael是个半路程序员 942

Leetcode1129. 颜色交替最短路径(medium,BFS)

Leetcode1129. 颜色交替最短路径(medium,BFS),Python题解

chenxy_bwave的专栏 989

LeetCode 1129. 颜色交替最短路径--进行路径标记后BFS

颜色交替最短路径 在一个有向图中,节点分别标记为 0, 1, …, n-1。这个图中的每条边不是红色就是蓝色,且存在自环或平行边。 red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。类似地,blue_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的蓝色有向边。 返回长度为 n 的数组 answer,其中 answer[X] 是从节点 0 到节点 X 的红色边和蓝色边交替出现的最短路径的长度。如果不存在这样的路径,那么 answer[x] =.

weixin_43918046的博客 293

力扣1129. 颜色交替最短路径BFS

本题和一般的BFS求最短路有所不同; 一般的最短路BFS中,更新到每个点的距离,并设置vis数组,避免重复访问; 但对于本题是可能重复访问的,因为要红蓝交替,为到达某一结点,可以以红边访问过后再次用蓝边访问,可能达到其他点的最优解; 但也就需要在此多设个vis状态位即可,当分别以红蓝边访问过,就等同于以前的BFS; 这样队列里就要多存个边的颜色的信息; BFS不断更新答案即可; class Solution { public: vector<int> shortestAlterna...

lllzzzhhh2589的记录 696

leetocde1129. 颜色交替最短路径bfs

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

weixin_44560620的博客 142

Leetcode 1129. 颜色交替最短路径BFS

题目 思路 这道题在搜索相关题目里应该算hard难度的题目了。本题的基本方法比较直接,求最短路径最先想到广度优先搜索(BFS)。首先题目只要求是蓝红交替即可,并没有指定哪个颜色做开头,因此需要分两种情况分别进行bfs,最后对于同一个点,选择两种方法中有数据且较小的数值作为答案。本题的最重要注意点如下: 题目明确说明了该有向图存在自环和平行边,也就是说在搜索的过程中可以经过同一个点两次来达到调整的目的。因此不同于大多数搜索类题目,这道题中同一个节点在搜索过程中最多允许经过两次。...

qq_41461410的博客 355

leetcode.1129 颜色交替最短路径 - BFS + 最短路

bfs 求最短路

weixin_61639349的博客 380

【每日一题Day106】LC1129 颜色交替最短路径 | BFS

【每日一题Day106】LC1129 颜色交替最短路径 | BFS

Tikitian的博客 364

图论】B_1129. 颜色交替最短路径bfs / dfs)

一、题目描述 Consider a directed graph, with nodes labelled 0, 1, …, n-1. In this graph, each edge is either red or blue, and there could be self-edges or parallel edges. Each [i, j] in red_edges denotes a...

无敌兔0x01 492

1129. 颜色交替最短路径BFS

【代码】1129. 颜色交替最短路径BFS

henulmh的博客 187

LeetCode_BinaryTree_1129. Shortest Path with Alternating Colors 颜色交替最短路径BFS最短路径】【java】【中等】

BFS求最短颜色交替路径

&再见萤火虫&的博客 392

[M最短路] lc1129. 颜色交替最短路径(bfs最短路+拆点+拆边+好题)

leetcode

Y-puyu 的博客 504
上一篇: 【图的深度优先、广度优先】200. 岛屿数量
下一篇: 【DFS/BFS】1466. 重新规划路径
LogosTR_
博客等级 码龄4年 362粉丝 · 52原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值