Python 中交替顏色最短路徑


假設我們有一個有向圖,節點標記為 0、1、...、n-1。在這個圖中,每條邊都用紅色或藍色著色,並且可能存在自環或平行邊。red_edges 中的每個 [i, j] 表示從節點 i 到節點 j 的紅色有向邊。類似地,blue_edges 中的每個 [i, j] 表示從節點 i 到節點 j 的藍色有向邊。我們必須找到一個長度為 n 的陣列 answer,其中每個 answer[X] 是從節點 0 到節點 X 的最短路徑的長度,使得路徑上的邊顏色交替(或者如果這樣的路徑不存在則為 -1)。

因此,如果輸入類似於 n = 3、red_edges = [[0,1],[1,2]] 和 blue_edges = [],則輸出將為 [0, 1, -1]

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個名為 bfs() 的方法,它將接收 re、be、f 和 n

  • 定義一個名為 visited 的集合,定義一個佇列並插入一個三元組 [0, f, 0]

  • 當 q 不為空時

    • 將三元組 current、color、step 設定為 q[0],並從 q 中刪除

    • color := 取反 color 的值(true 變為 false,反之亦然)

    • res[current] := res[current] 和 step 的最小值

    • 如果 color 非零,則

      • 對於 re[current] 中的每個 i

        • 如果對 (i, color) 不在 visited 中,則將 (i, color) 插入 visited 並將 [i, color, step + 1] 插入 q

    • 否則當 color 為 0 時,則

      • 對於 be[current] 中的每個 i

        • 如果對 (i, color) 不在 visited 中,則將 (i, color) 插入 visited 並將 [i, color, step + 1] 插入 q

  • 在主方法中:

  • res := 一個包含無限大值的陣列,其大小為 n

  • re 和 be := n 個空陣列

  • 對於 r 中的每個元素 i:將 i[1] 插入 re[i[0]]

  • 對於 b 中的每個元素 i:將 i[1] 插入 be[i[0]]

  • 呼叫 bfs(re, be, false, n) 並呼叫 bfs(re, be, true, n)

  • 對於範圍從 0 到 res 長度 - 1 的 i

    • 如果 res[i] = inf,則 res[i] := -1

  • 返回 res

示例(Python)

讓我們看看以下實現以獲得更好的理解:

 線上演示

class Solution(object):
   def shortestAlternatingPaths(self, n, r, b):
      self.res = [float("inf")] * n
      re = [[] for i in range(n) ]
      be = [[] for i in range(n) ]
      for i in r:
         re[i[0]].append(i[1])
      for i in b:
         be[i[0]].append(i[1])
      self.bfs(re,be,False,n)
      self.bfs(re,be,True,n)
      for i in range(len(self.res)):
         if self.res[i] == float('inf'):
            self.res[i]=-1
      return self.res
   def bfs(self,re,be,f,n):
      visited = set()
      queue = [[0,f,0]]
      while queue:
         current,color,step = queue[0]
         queue.pop(0)
         color = not color
         self.res[current] = min(self.res[current],step)
         if color:
            for i in re[current]:
               if (i,color) not in visited:
                  visited.add((i,color))
                  queue.append([i,color,step+1])
         elif not color:
            for i in be[current]:
               if (i,color) not in visited:
                  visited.add((i,color))
                  queue.append([i,color,step+1])
ob = Solution()
print(ob.shortestAlternatingPaths(3, [[0,1], [1,2]], []))

輸入

3
[[0,1],[1,2]]
[]

輸出

[0,1,-1]

更新於: 2020年4月30日

575 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告