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

今日份题目:

给定一个整数 n,即有向图中的节点数,其中节点标记为 0n - 1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。

给定两个数组 redEdgesblueEdges,其中:

  • redEdges[i] = [ai, bi] 表示图中存在一条从节点 ai 到节点 bi 的红色有向边,

  • blueEdges[j] = [uj, vj] 表示图中存在一条从节点 uj 到节点 vj 的蓝色有向边。

返回长度为 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]

提示

  • 1 <= n <= 100

  • 0 <= redEdges.length, blueEdges.length <= 400

  • redEdges[i].length == blueEdges[j].length == 2

  • 0 <= ai, bi, uj, vj < n

题目思路

依旧是使用bfs广度优先遍历,详细过程可看代码中的注释。

本道题目主要是注意细节,比如三维表next、二维表dist等等。

代码

cpp 复制代码
class Solution 
{
public:
    vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) 
    {
        vector<vector<vector<int> > > next(2,vector<vector<int> >(n));
        for(auto &e:redEdges) 
        {
            next[0][e[0]].push_back(e[1]);//第一个二维表存放红边信息
        }
        for(auto &e:blueEdges) 
        {
            next[1][e[0]].push_back(e[1]);//第二个二维表存放蓝边信息
        }

        vector<vector<int> > dist(2,vector<int>(n,INT_MAX)); //两种类型的颜色最短路径的长度
        queue<pair<int, int> > p;
        dist[0][0]=0;
        dist[1][0]=0;
        p.push({0,0});//第一个表的0
        p.push({0,1});//第二个表的0
        while(!p.empty()) 
        {
            int xy=p.front();
            p.pop();
            for(auto y:next[1-xy.second][xy.first]) //遍历当前点的邻接点
            {
                if(dist[1-xy.second][y]!=INT_MAX) //表示遍历过了
                {
                    continue;
                }
                //实现交替路径
                dist[1-xy.second][y]=dist[xy.second][xy.first]+1;//另一个颜色的边数加一
                p.push({y,1-xy.second});
            }
        }
        vector<int> ans(n);
        for(int i=0;i<n;i++) 
        {
            ans[i]=min(dist[0][i],dist[1][i]);//两个图中最小的路径长
            if(ans[i]==INT_MAX) //不存在,置为-1
            {
                ans[i]=-1;
            }
        }
        return ans;
    }
};

提交结果

欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!

相关推荐
白榆maple19 分钟前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少23 分钟前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs1130 分钟前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
程序员勋勋1 小时前
【自动化测试】如何在jenkins中搭建allure
职场和发展·jenkins·测试覆盖率
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
昂子的博客2 小时前
基础数据结构——队列(链表实现)
数据结构
咕咕吖2 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎2 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode