給你乙個points 陣列,表示 2d 平面上的一些點,其中 points[i] = [xi, yi] 。
連線點 [xi, yi] 和點 [xj, yj] 的費用為它們之間的 曼哈頓距離 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的絕對值。
請你返回將所有點連線的最小總費用。只有任意兩點之間 有且僅有 一條簡單路徑時,才認為所有點都已連線。
示例 1:
輸入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
輸出:20
解釋:
我們可以按照上圖所示連線所有點得到最小總費用,總費用為 20 。
注意到任意兩個點之間只有唯一一條路徑互相到達。
對於這道題來說,需要用最小生成樹的方法來解決,這裡採用kruskal演算法並且用並查集的方法判斷圖中節點的連通性,保證兩點之間有且僅有一條邊
kruskal演算法
將任意兩節點的距離得出,並且按照從小到大的順序排序,然後根據節點距離依次將兩點連線,此題樹的根節點可以隨意選擇,我將第乙個點設定為這個最小生成樹的根節點,其實就是使用貪心的方法
from typing import list
class
disjointsetunion
:def
__init__
(self,n)
: self.n = n
self.rank =[1
]*n# 用來判斷節點級別,確認根節點
self.f =
list
(range
(n))
deffind
(self, x:
int)
->
int:
if self.f[x]
== x:
return x
self.f[x]
= self.find(self.f[x]
)return self.f[x]
defunionset
(self, x:
int, y:
int)
->
bool
: fx,fy = self.find(x)
, self.find(y)
if fx == fy:
# 若父節點一致,則這兩個節點不能相連
return
false
if self.rank[fx]
< self.rank[fy]
: fx, fy = fy, fx
self.rank[fx]
+= self.rank[fy]
self.f[fy]
= fx # 將級別低的點併入級別高的父節點中
return
true
class
solution
:def
mincostconnectpoints
(self, points: list[list[
int]])
->
int:
dist =
lambda x,y :
abs(points[x][0
]- points[y][0
])+abs
(points[x][1
]- points[y][1
])n =
len(points)
dsu = disjointsetunion(n)
edges =
# 得出圖中任意兩點的邊的集合
for i in
range
(n):
for j in
range
(i+1
,n):
(dist(i,j)
,i,j)
) edges.sort(
) ret,num =0,
1for lengh,x,y in edges:
if dsu.unionset(x,y)
:# 使用並查集維護連通性,若當前邊兩端不連通即可選擇這條邊
ret += lengh
num +=
1if num == n:
break
return ret
leecode 1584 連線所有點的最小費用
給你乙個points 陣列,表示 2d 平面上的一些點,其中 points i xi,yi 連線點 xi,yi 和點 xj,yj 的費用為它們之間的 曼哈頓距離 xi xj yi yj 其中 val 表示 val 的絕對值。請你返回將所有點連線的最小總費用。只有任意兩點之間 有且僅有 一條簡單路徑時...
每日一題 1584 連線所有點的最小費用
1584.連線所有點的最小費用 分類 圖 最小生成樹 prime演算法 class solution public int mincostconnectpoints vector points int n points.size vectorvisited n,false vectorcost n,...
Python基礎11 連線所有點的最小費用
給你乙個points 陣列,表示 2d 平面上的一些點,其中 points i xi,yi 連線點 xi,yi 和點 xj,yj 的費用為它們之間的 曼哈頓距離 xi xj yi yj 其中 val 表示 val 的絕對值。請你返回將所有點連線的最小總費用。只有任意兩點之間 有且僅有 一條簡單路徑時...