前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1129. 颜色交替的最短路径(BFS)

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

作者头像
Michael阿明
发布2021-02-19 14:26:04
5350
发布2021-02-19 14:26:04
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

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。

代码语言:javascript
复制
示例 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 个状态(红的访问没?蓝的访问没?)
代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/09/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档