題目描述:
在乙個有向圖中,節點分別標記為 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
方法1:
(1)在正常的求最短路徑使用bfs的基礎上,考慮到題目中要求的顏色交替的條件;
(2)這裡分別建立紅色路徑的圖和藍色路徑的圖,初始化的距離陣列中的元素為pair,其中的first表示當前結點以紅色結尾的最短長度,second表示當前結點以藍色結尾的最短長度;
(3)隨後的廣度優先搜尋中同時處理兩種可能的情況,獲得更小的路徑長度;
class
solution
for(vector<
int>
&blue:blue_edges)
//建立佇列
queue<
int> q;
q.push(0
);//初始化佇列
vectorint,
int>>
distance
(n,pair<
int,
int>
(int_max,int_max));
//距離陣列
distance[0]
.first=0;
distance[0]
.second=0;
while
(!q.
empty()
)}}//說明當前結點使用藍色作為結尾可以,且下乙個紅色的結點存在
if(dist_blue!=int_max&&red_graph.
count
(cur_node))}
}}//更新可能獲得距離
vector<
int>
res(n,-1
);int index=0;
for(pair<
int,
int>
&it:distance)
++index;
}return res;}}
;
1129 顏色交替的最短路徑(dfs)
1.問題描述 在乙個有向圖中,節點分別標記為 0,1,n 1。這個圖中的每條邊不是紅色就是藍色,且存在自環或平行邊。red edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的紅色有向邊。類似地,blue edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的藍色有向邊。返回長...
Leetcode 1129 顏色交替的最短路徑
在乙個有向圖中,節點分別標記為0,1,n 1。這個圖中的每條邊不是紅色就是藍色,且存在自環或平行邊。red edges中的每乙個 i,j 對表示從節點i到節點j的紅色有向邊。類似地,blue edges中的每乙個 i,j 對表示從節點i到節點j的藍色有向邊。返回長度為n的陣列answer,其中ans...
Leetcode 1129 顏色交替的最短路徑
1129.顏色交替的最短路徑 難!題目 在乙個有向圖中,節點分別標記為 0,1,n 1。這個圖中的每條邊不是紅色就是藍色,且存在自環或平行邊。red edges 中的每乙個 i,j 對表示從節點 i 到節點 j 的紅色有向邊。類似地,blue edges 中的每乙個 i,j 對表示從節點 i 到節點...