在乙個有向圖中,節點分別標記為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
bfs,從節點0起,每次走一步,這樣保證到達每個節點時路徑是最短的。因為題目要的是紅藍相間,所以「紅藍紅」、「藍紅藍」這兩種分別以「紅」開頭和以「藍」開頭的都要考慮。比較巧妙的方法是利用佇列,使得這兩種依次走一步,正好能求出結果。
class
solution
:def
shortestalternatingpaths
(self, n:
int, red_edges: list[list[
int]
], blue_edges: list[list[
int]])
-> list[
int]
:from collections import defaultdict
red_colloction = defaultdict(
list
) blue_collection = defaultdict(
list
)for point in red_edges:
red_colloction[point[0]
]1])
for point in blue_edges:
blue_collection[point[0]
]1])
red_visit =
blue_visit =
queue =[(
0,0,
"red"),
(0,0
,"blue")]
ans =
[float
("inf"
)for i in
range
(n)]
while queue:
curr, level, color = queue.pop(0)
if(color ==
"red"):
for point in red_colloction[curr]:if
(point not
in red_visit)
: red_visit[point]
=true
(point, level+1,
"blue"))
ans[point]
=min
(ans[point]
, level+1)
else
:for point in blue_collection[curr]:if
(point not
in blue_visit)
: blue_visit[point]
=true
(point, level+1,
"red"))
ans[point]
=min
(ans[point]
, level+1)
ans =[-
1if x==
float
("inf"
)else x for x in ans]
ans[0]
=0return ans
Leetcode 1129 顏色交替的最短路徑
1129.顏色交替的最短路徑 難!題目 在乙個有向圖中,節點分別標記為 0,1,n 1。這個圖中的每條邊不是紅色就是藍色,且存在自環或平行邊。red edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的紅色有向邊。類似地,blue edges 中的每乙個 i,j 對表示從節點 i 到節點...
1129 顏色交替的最短路徑
題目描述 在乙個有向圖中,節點分別標記為 0,1,n 1。這個圖中的每條邊不是紅色就是藍色,且存在自環或平行邊。red edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的紅色有向邊。類似地,blue edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的藍色有向邊。返回長度為...
1129 顏色交替的最短路徑(dfs)
1.問題描述 在乙個有向圖中,節點分別標記為 0,1,n 1。這個圖中的每條邊不是紅色就是藍色,且存在自環或平行邊。red edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的紅色有向邊。類似地,blue edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的藍色有向邊。返回長...