基本資料#
難易度: medium 第一次嘗試: 2025-05-06
- 總花費時間:10:00.00
解題思路#
若要讓所有電腦互相連接,最少需要 n - 1
條線,其中 n
是電腦數量。
如果現有的線(m
條)少於 n - 1
,則不可能讓所有電腦都連起來。
因此,我們可以使用並查集(Union Find)來把所有已經連接的電腦合併成一組。
合併完成後,我們就可以知道總共有多少個獨立的群組,也就知道還需要多少額外的線來連接這些群組。
在 union 的過程中,如果發現兩台電腦已經在同一個群組,那就代表這條線是多餘的,我們可以把它記錄下來作為可移動的線。
最後,我們只需要判斷多餘的線是否足夠連接剩下的獨立群組(也就是 獨立群組數量 - 1
),如果夠就回傳需要的操作次數,否則回傳 -1
。
解法#
class Solution:
def makeConnected(self, n: int, connections: List[List[int]]) -> int:
parent = [i for i in range(n)]
ranking = [0 for _ in range(n)]
extra = 0
needed = 0
def find(n):
if parent[n] != n:
parent[n] = find(parent[n])
return parent[n]
def union(x, y):
nonlocal extra
root_x = find(x)
root_y = find(y)
if root_x == root_y:
extra += 1
return
if ranking[root_x] > ranking[root_y]:
parent[root_y] = parent[root_x]
ranking[root_x] += ranking[root_y]
else:
parent[root_x] = parent[root_y]
ranking[root_y] += ranking[root_x]
for x, y in connections:
union(x, y)
for i in range(n):
if parent[i] == i:
needed += 1
return needed - 1 if (needed - 1) <= extra else -1