每天一道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;
    }
};

提交结果

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

相关推荐
小叶学C++7 分钟前
【C++】类与对象(下)
java·开发语言·c++
Funny_AI_LAB18 分钟前
MetaAI最新开源Llama3.2亮点及使用指南
算法·计算机视觉·语言模型·llama·facebook
NuyoahC25 分钟前
算法笔记(十一)——优先级队列(堆)
c++·笔记·算法·优先级队列
jk_10127 分钟前
MATLAB中decomposition函数用法
开发语言·算法·matlab
penguin_bark1 小时前
69. x 的平方根
算法
FL16238631291 小时前
[C++]使用纯opencv部署yolov11-pose姿态估计onnx模型
c++·opencv·yolo
sukalot1 小时前
windows C++-使用任务和 XML HTTP 请求进行连接(一)
c++·windows
一休哥助手1 小时前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
这可就有点麻烦了1 小时前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
苏宸啊1 小时前
顺序表及其代码实现
数据结构·算法