LeetCode 1129颜色交替的最短路径广度优先HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1129颜色交替的最短路径广度优先HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。



解题思路:
一道非常有意思的广度优先遍历问题,一般的优先遍历问题,即可以广度优先遍历,也可以深度优先遍历,甚至动态规划求解,但是这里并不是求单一最优解问题,也不是按照顺序去执行的,所以深度优先和动态规划不太适用。这道题最有意思的地方在于,有向连接是有颜色区分的,也就是说,在构建邻接矩阵时,要考虑颜色的不同,同时红蓝相间连接表明要不断交替遍历红邻接矩阵和蓝邻接矩阵,红先红后两种情况都要考虑,剩下的就是简单的广度优先模板了,只不过要执行两遍罢了。步骤如下:

  1. 构建红蓝邻接矩阵;
  2. 构建dist数组,初始化队列;
  3. 从零节点开始红蓝相间遍历,更新dist数组;
  4. 遍历dist数组,选择红先蓝先最小的距离;

代码如下:

class Solution 
public:
    vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) 
        // 构建邻接矩阵
        vector<vector<int>> red(n);
        vector<vector<int>> blue(n);
        for(auto& redEdge : redEdges) 
            red[redEdge[0]].emplace_back(redEdge[1]);
        
        for(auto& blueEdge : blueEdges) 
            blue[blueEdge[0]].emplace_back(blueEdge[1]);
        
        // 记录不同颜色最短路径
        vector<vector<int>> dist(2, vector<int>(n, INT_MAX));
        // 队列
        queue<pair<int, int>> q;
        // 零点初始化
        dist[0][0] = 0;
        dist[1][0] = 0;
        // 零点入队列(类型、顶点)
        q.push(0, 0);
        q.push(1, 0);
        while(!q.empty()) 
            auto [t, index] = q.front();
            q.pop();
            // 如果是红色
            if(t == 0) 
                for(auto& b : blue[index]) 
                    if(dist[1 - t][b] == INT_MAX) 
                        dist[1 - t][b] = dist[t][index] + 1;
                        q.push(1 - t, b);
                     else continue;
                
             else  // 如果是蓝色
                for(auto& r : red[index]) 
                    if(dist[1 - t][r] == INT_MAX) 
                        dist[1 - t][r] = dist[t][index] + 1;
                        q.push(1 - t, r);
                     else continue;
                
            
        
        vector<int> res(n);
        for(int i = 0; i < n; i ++) 
            res[i] = min(dist[0][i], dist[1][i]);
            if(res[i] == INT_MAX) 
                res[i] = -1;
            
        
        return res;
    
;

以上是关于LeetCode 1129颜色交替的最短路径广度优先HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1091 二进制矩阵中的最短路径问题[BFS 队列] HERODING的LeetCode之路

修改广度优先搜索算法以记住矩阵中的最短路径

leetcode 934. Shortest Bridge 最短的桥(中等)

LeetCode1293网格中的最短路径(DFS和BFS)分析

LeetCode刷题之BFS和DFS

最短路径问题之广度优先算法BFS(C语言)