Python程式:找出公民能夠到達市場的最小成本


假設有n個城市和m條連線這些城市的道路。市民需要市場來購買商品。現在,城市裡沒有市場,城市之間的道路正在建設中。如果滿足以下條件,則可以在兩個城市之間修建雙向道路:(i) 該城市包含一個市場;(ii) 可以透過連線有市場的道路到達這些城市。修建道路的成本為x,修建市場的成本為y,兩者均已給出。我們需要找出使每個城市的市民都能到達市場的最小成本。陣列'cities'包含有關城市的資訊,說明哪些城市可以透過道路連線。

因此,如果輸入類似於n = 4,m = 3,x = 1,y = 2,cities = [[1, 2], [2, 3], [3, 4]],則輸出將為4。

在這裡,我們可以看到四個城市1、2、3和4。如果在城市1處建立一個市場,並在(1, 4)和(1,3)之間修建兩條道路,則總成本將為2 + 1 + 1 = 4。這是最小成本。

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

  • 如果x <= y,則
    • 返回n * x
  • 否則,
    • adj_list := 一個包含列表作為元素的對映
    • 對於cities中的每個城市,執行以下操作:
      • city1 := city[0]
      • city2 := city[1]
      • 將city2插入adj_list[city1]的末尾
      • 將city1插入adj_list[city2]的末尾
    • temp := 一個大小為(n + 1)的新列表,初始化值為True
    • value := 0
    • dq := 一個雙端佇列
    • 對於cur從1到n + 1,執行以下操作:
      • 如果temp[cur]不為零,則
        • value := value + x
        • 將cur插入dq的最右邊
        • temp[cur] := False
        • 當dq不為空時,執行以下操作:
        • 對於dq中提取的左側元素的每個相鄰元素i,執行以下操作:
          • 如果temp[i]不為零,則
            • 將i插入dq的最右邊
            • temp[i] := False
            • value := value + y
    • 返回value

示例

讓我們看看以下實現以更好地理解:

from collections import defaultdict, deque
def solve(n, m, x, y, cities):
   if x <= y:
      return n * x
   else:
      adj_list = defaultdict(list)
      for city in cities:
         city1 = city[0]
         city2 = city[1]
         adj_list[city1].append(city2)
         adj_list[city2].append(city1)
      temp = [True] * (n + 1)
      value = 0
      dq = deque()
      for cur in range(1, n + 1):
         if temp[cur]:
            value += x
            dq.append(cur)
            temp[cur] = False
            while dq:
               for i in adj_list[dq.popleft()]:
                  if temp[i]:
                     dq.append(i)
                     temp[i] = False
                     value += y
      return value

print(solve(4, 3, 1, 2, [[1, 2], [2, 3], [3, 4]]))

輸入

4, 3, 2, 1, [[1, 2], [2, 3], [3, 4]]

輸出

4

更新於: 2021年10月23日

264 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.