今日份题目:
给定一个整数 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;
}
};
提交结果
欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!