1129. 颜色交替的最短路径(leetcode,广搜,可重做)-------------------Java实现
题目表述
给定一个整数 n,即有向图中的节点数,其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。
给定两个数组 redEdges 和 blueEdges,其中:
redEdgesi = ai, bi 表示图中存在一条从节点 ai 到节点 bi 的红色有向边,
blueEdgesj = uj, vj 表示图中存在一条从节点 uj 到节点 vj 的蓝色有向边。
返回长度为 n 的数组 answer,其中 answerX 是从节点 0 到节点 X 的红色边和蓝色边交替出现的最短路径的长度。如果不存在这样的路径,那么 answerx = -1。
样例
n =5
redEdges =\[0,1,1,2,2,3,3,4]
blueEdges =\[1,2,2,3,3,1]
条件
1 <= n <= 100
0 <= redEdges.length, blueEdges.length <= 400
redEdgesi.length == blueEdgesj.length == 2
0 <= ai, bi, uj, vj < n
思路
通过一个二维n2List来记录当前点可以到达的下个点。
广搜,搜索记录到达点的长度。
注意点
x^1 可实现 x1时返回0,x0时返回1,异或运算。
ac代码
Java:
java
package leetcode1129;
import java.util.*;
class Solution {
public int[] shortestAlternatingPaths(int n, int[][] redEdges, int[][] blueEdges) {
List<Integer> target[][] = new List[n][2];
int[][] visit = new int[n][2];
int max = 10000009;
for (int i=0;i<n;i++) {
target[i][0] = new ArrayList<Integer>();
target[i][1] = new ArrayList<Integer>();
visit[i][0] = max;
visit[i][1] = max;
}
for (int[] x:redEdges)
target[x[0]][0].add(x[1]);
for (int[] x:blueEdges)
target[x[0]][1].add(x[1]);
Queue<Integer[]> q = new LinkedList<>();
q.offer(new Integer[]{0,0});
q.offer(new Integer[]{0,1});
int this_step = 0;
while(!q.isEmpty())
{
int this_longth = q.size();
while(this_longth--!=0)
{
Integer[] now_sit = q.poll();
if (visit[now_sit[0]][now_sit[1]]!=max)
continue;
else
visit[now_sit[0]][now_sit[1]]=this_step;
for (Integer now:target[now_sit[0]][now_sit[1]^1])
q.offer(new Integer[]{now,now_sit[1]^1});
}
this_step++;
}
int[] result = new int[n];
for (int i=1;i<n;i++) {
result[i] = Math.min(visit[i][0], visit[i][1]);
if (result[i]==max)
result[i] =-1;
}
return result;
}
}
public class leetocde1129 {
public static void main(String[] args) {
int n = 5;
int[][] red_edges = new int[][]{
{0,1},{1,2},{2,3},{3,4}
};
int[][] blue_edges = new int[][]{{1,2},{2,3},{3,1}};
Solution s = new Solution();
int[] result = s.shortestAlternatingPaths(n,red_edges,blue_edges);
for (int x:result)
System.out.println(x+" ");
};
}