Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで最小コストで都市を接続する


1からNまでの番号が付けられたN個の都市があるとします。接続があります。各接続[i]は[city1、city2、cost]で、これはcity1とcity2を接続するためのコストを表します。 。都市のすべてのペアに対して、これら2つの都市を接続する接続パス(おそらく長さ1)が存在するように、最小コストを見つける必要があります。コストは、使用された接続コストの合計です。タスクが不可能な場合は、-1を返します。

したがって、グラフが次のような場合-

Pythonで最小コストで都市を接続する

その場合、出力は6になります。任意の2つの都市を選択すると、すべての都市が接続されるため、最小の2、[1、5]

を選択します。

これを解決するには、次の手順に従います-

  • find()というメソッドを定義します。これにはx

    が必要です。
  • parent [x]が-1の場合、x

    を返します
  • parent [x]:=find(parent [x])

  • 親を返す[x]

  • union()と呼ばれる別のメソッドを作成します。これにはxとyが必要です

  • parent_x:=find(x)、parent_y:=find(y)

  • parent_x =parent_yの​​場合は戻り、それ以外の場合はparent [parent_y]:=parent_x

  • メインの方法から、nとconnが必要になります

  • 親:=サイズnの配列で、これを– 1で埋め、互いに素な:=n – 1、コスト:=0

    を設定します。
  • c:=connのソート済みリスト、コストに基づいてこれをソート

  • i:=0

  • i

    • x:=c [i、0]およびy:=c [i、1]

    • find(x)がfind(y)と同じでない場合は、互いに素を1減らし、コストをc [i、2]増やし、union(x、y)を実行します

    • iを1増やします

  • 互いに素が0の場合はコストを返し、それ以外の場合は-1を返します

例(Python)

理解を深めるために、次の実装を見てみましょう-

class Solution(object):
   def find(self, x):
      if self.parent[x] == -1:
         return x
      self.parent[x] = self.find(self.parent[x])
      return self.parent[x]
   def union(self,x,y):
      parent_x = self.find(x)
      parent_y = self.find(y)
      if parent_x == parent_y:
         return
      self.parent[parent_y] = parent_x
   def minimumCost(self, n, connections):
      self.parent = [ -1 for i in range(n+1)]
      disjoint = n-1
      cost = 0
      c = sorted(connections,key=lambda v:v[2])
      i = 0
      while i<len(c) and disjoint:
         x = c[i][0]
         y = c[i][1]
         if self.find(x)!=self.find(y):
            disjoint-=1
            cost+=c[i][2]
            self.union(x,y)
            i+=1
         return cost if not disjoint else -1
ob = Solution()
print(ob.minimumCost(3, [[1,2,5], [1,3,6], [2,3,1]]))

入力

3
[[1,2,5],[1,3,6],[2,3,1]]
出力
-1

  1. Pythonでボードを正方形にカットするための最小コスト

    長さp、幅qのボードがあるとします。このボードをp*qの正方形に分割して、分割のコストを可能な限り最小限に抑える必要があります。各エッジの切削コストが示されます。 したがって、入力がX_slice =[3,2,4,2,5]の場合、Y_slice =[5,2,3] その場合、出力は65になります これを解決するには、次の手順に従います- res:=0 水平:=1、垂直:=1 i:=0、j:=0 i

  2. Pythonのリーフ値からの最小コストツリー

    正の整数の配列arrがあると仮定し、次のようなすべての二分木を検討します- 各ノードには0個または2個の子があります。 arr配列の値は、ツリーを順番にトラバースする際の各リーフの値に対応します。 各非リーフノードの値は、それぞれその左サブツリーと右サブツリーの最大リーフ値の積に等しくなります。 考慮されるすべての可能な二分木の中で、各非リーフノードの値の可能な最小の合計を見つける必要があります。したがって、入力arrが[6,2,4]の場合、2つのツリーが存在する可能性があるため、出力は32になります- これを解決するには、次の手順に従います- メモと呼ばれる地図を作成する