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

tech2024-05-21  71

文章目录

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 的红色边和蓝色边交替出现的最短路径的长度。 如果不存在这样的路径,那么 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] 示例 3: 输入:n = 3, red_edges = [[1,0]], blue_edges = [[2,1]] 输出:[0,-1,-1] 示例 4: 输入:n = 3, red_edges = [[0,1]], blue_edges = [[1,2]] 输出:[0,1,2] 示例 5: 输入:n = 3, red_edges = [[0,1],[0,2]], blue_edges = [[1,0]] 输出:[0,1,1] 提示: 1 <= n <= 100 red_edges.length <= 400 blue_edges.length <= 400 red_edges[i].length == blue_edges[i].length == 2 0 <= red_edges[i][j], blue_edges[i][j] < n

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shortest-path-with-alternating-colors 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

分两种情况从 0 出发,红色,或者蓝色每个点的访问标记 vis 有 2 个状态(红的访问没?蓝的访问没?) class Solution { public: vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& red_edges, vector<vector<int>>& blue_edges) { vector<vector<int>> dis(2, vector<int>(n, INT_MAX)); vector<vector<int>> r(n), b(n); for(auto& e : red_edges) r[e[0]].push_back(e[1]); for(auto& e : blue_edges) b[e[0]].push_back(e[1]);//建图 bfs(r,b,0,dis);//出发,case1 bfs(r,b,1,dis);//出发,case2 vector<int> ans(n,-1); for(int i = 0; i < n; ++i) { ans[i] = min(dis[0][i], dis[1][i]); if(ans[i] == INT_MAX) ans[i] = -1; } return ans; } void bfs(vector<vector<int>>& r, vector<vector<int>>& b, int flag, vector<vector<int>>& dis) { int n = r.size(), cur, size, step = 0; vector<vector<bool>> vis(2, vector<bool>(n, false));//访问标记 queue<int> q; q.push(0); vis[flag][0] = true; while(!q.empty()) { size = q.size(); while(size--) { cur = q.front(); dis[flag][cur] = min(dis[flag][cur], step);//取最小的路径 q.pop(); if(flag)//走红色的 { for(auto nt : r[cur]) { if(vis[flag][nt])//访问过了,不能再次访问 continue; vis[flag][nt] = true; q.push(nt); } } else//走蓝色的 { for(auto nt : b[cur]) { if(vis[flag][nt]) continue; vis[flag][nt] = true; q.push(nt); } } } step++;//步数+1 flag = !flag;//换地图颜色 } } };

36 ms 13.6 MB


我的博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

最新回复(0)