文章目录
- 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);//出发,case1bfs(r,b,1,dis);//出发,case2vector<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++;//步数+1flag = !flag;//换地图颜色}}
};
36 ms 13.6 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!