1129 顏色交替的最短路徑(dfs)

2021-10-23 18:48:43 字數 2607 閱讀 2112

1. 問題描述:

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

2. 思路分析:

① 這道題目有乙個比較明顯的特點是需要嘗試才能夠知道最終的答案,並且還是乙個圖論的問題所以可以使用dfs搜尋來解決,但是怎麼樣去處理搜尋的細節是乙個需要思考的問題,因為是紅藍交替出現的所以感覺處理起來還是需要一定的技巧的,在領扣的題解中發現乙個比較好的處理搜尋細節的方法,使用的是c++**編寫的,我自己理解之後使用了python語言進行解決,下面是我對於大佬的**的一些理解

② 比較核心的是使用乙個二維列表記錄中間的結果,第一維表示的是當前的頂點,第二維表示的是顏色,0表示紅色,1表示藍色,在遞迴的過程中需要交替遞迴不同顏色的路徑這樣才可以表示紅藍交替出現的路徑,所以可以使用乙個三維的列表來表示題目中給出的紅色路徑與藍色路徑表示的圖,我們在遞迴的時候可以傳入當前遞迴的顏色,往下遞迴的時候就可以根據傳入的顏色來決定往下遞迴的是哪一種顏色的路徑,在遞迴的dfs方法中比較核心的是下面的if判斷:

這個可以自己在圖上畫一下具體的例子來理解會更好一點

③ 在dfs搜尋的過程中,需要使用下標也就是當前的頂點來進行遞迴的,這裡可以使用collections.defaultdict(list)建立字典的形式來儲存圖,這樣在遞迴的時候可以直接使用下標進行訪問

3. **如下:

import collections

import sys

from typing import list

class solution:

def dfs(self, graph: list[list[list[int]]], color: int, res: list[list[int]], cur: int):

# 可以使用異或操作來表示0還是1

for i in graph[color][cur]:

if res[cur][color] + 1 < res[i][color ^ 1]:

res[i][color ^ 1] = res[cur][color] + 1

self.dfs(graph, color ^ 1, res, i)

def shortestalternatingpaths(self, n: int, red_edges: list[list[int]], blue_edges: list[list[int]]) -> list[int]:

# 初始化能夠使用下標來訪問的紅色和藍色的有向圖

rg, bg = collections.defaultdict(list), collections.defaultdict(list)

for cur in red_edges:

for cur in blue_edges:

graph = list()

res = [[sys.maxsize] * 2 for i in range(n)]

res[0][0], res[0][1] = 0, 0

self.dfs(graph, 0, res, 0)

self.dfs(graph, 1, res, 0)

ans = [0 for i in range(n)]

for i in range(n):

ans[i] = min(res[i][0], res[i][1])

if ans[i] == sys.maxsize:

ans[i] = -1

return ans

1129 顏色交替的最短路徑

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