Pythonで最小コストで都市を接続する
1からNまでの番号が付けられたN個の都市があるとします。接続があります。各接続[i]は[city1、city2、cost]で、これはcity1とcity2を接続するためのコストを表します。 。都市のすべてのペアに対して、これら2つの都市を接続する接続パス(おそらく長さ1)が存在するように、最小コストを見つける必要があります。コストは、使用された接続コストの合計です。タスクが不可能な場合は、-1を返します。
したがって、グラフが次のような場合-
その場合、出力は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を返します
理解を深めるために、次の実装を見てみましょう-
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
-
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
-
Pythonのリーフ値からの最小コストツリー
正の整数の配列arrがあると仮定し、次のようなすべての二分木を検討します- 各ノードには0個または2個の子があります。 arr配列の値は、ツリーを順番にトラバースする際の各リーフの値に対応します。 各非リーフノードの値は、それぞれその左サブツリーと右サブツリーの最大リーフ値の積に等しくなります。 考慮されるすべての可能な二分木の中で、各非リーフノードの値の可能な最小の合計を見つける必要があります。したがって、入力arrが[6,2,4]の場合、2つのツリーが存在する可能性があるため、出力は32になります- これを解決するには、次の手順に従います- メモと呼ばれる地図を作成する