1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
// red -> 0, blue -> 1
public int[] shortestAlternatingPaths(int n, int[][] redEdges, int[][] blueEdges) {
Map<Integer, List<int[]>> nodeNeighbors = new HashMap<>();
for (int[] redEdge : redEdges) {
int startNode = redEdge[0], endNode = redEdge[1];
nodeNeighbors.computeIfAbsent(startNode, (key) -> new ArrayList<>()).add(new int[] { endNode, 0 });
}
for (int[] blueEdge : blueEdges) {
int startNode = blueEdge[0], endNode = blueEdge[1];
nodeNeighbors.computeIfAbsent(startNode, (key) -> new ArrayList<>()).add(new int[] { endNode, 1 });
}
Deque<int[]> queue = new ArrayDeque<>();
boolean[][] visited = new boolean[n][2];
visited[0][0] = true;
visited[0][1] = true;
queue.offer(new int[] { 0, -1 });
int distance = 0;
int[] ans = new int[n];
Arrays.fill(ans, -1);
ans[0] = 0;
while (!queue.isEmpty()) {
for (int i = queue.size(); i > 0; i--) {
int[] currNodeInfo = queue.poll();
int currNode = currNodeInfo[0], lastEdgeColor = currNodeInfo[1];
ans[currNode] = ans[currNode] == -1 ? distance : Math.min(ans[currNode], distance);
if (nodeNeighbors.containsKey(currNode)) {
for (int[] neighborInfo : nodeNeighbors.get(currNode)) {
int neighbor = neighborInfo[0], pathColor = neighborInfo[1];
if (pathColor != lastEdgeColor && !visited[neighbor][pathColor]) {
visited[neighbor][pathColor] = true;
queue.offer(new int[] { neighbor, pathColor });
}
}
}
}
distance += 1;
}
return ans;
}
}

记录每个node是红色路线过来的还是蓝色路线过来的. 因此需要一个n * 2的boolean array. 一维的boolean array是不够的.

时间复杂度: O(E)
空间复杂度: O(N)