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

今日份题目:

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

给定两个数组 redEdges 和 blueEdges,其中:

  • 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;
    }
};

提交结果

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

相关推荐
Frank_refuel2 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
2601_949950633 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
hetao17338373 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6264 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan4 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356385 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah6 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO96 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician6 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
lsc_blog6 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘