1129 顏色交替的最短路徑

2021-10-14 16:25:35 字數 1984 閱讀 6801

題目描述:

在乙個有向圖中,節點分別標記為 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 到節點...