前往
大廳
主題

LeetCode - 1319. Number of Operations to Make Network Connected 解題心得

Not In My Back Yard | 2022-10-27 12:00:12 | 巴幣 112 | 人氣 190

題目連結:


題目意譯:
現在有編號為 0 到 n - 1 的 n 部電腦,其由乙太網路線 connections 所連成一個網路,其中 connections[i] = [ai, bi] 代表著電腦 a 和電腦 b 之間有著連線。任何電腦可以根據網路直接或間接地抵達其他的電腦。

你被給定一個初始電腦網路 connections。你可以從兩個直接相連的電腦之間擷取網路線,並把這些線接到任何一對不相連的電腦使它們直接地相連。

回傳為了使所有電腦相連,你最少需要重複做多少次的上述動作。如果不可能使所有電腦相連,則回傳 -1。

限制:
1 ≦ n ≦ 10 ^ 5
1 ≦ connections.length ≦ min(n × (n - 1) / 2, 10 ^ 5)
connections[i].length == 2
0 ≦ ai, bi < n
ai != bi
沒有重複的連線存在。
沒有兩台電腦被多於一條網路線相連在一起。



範例測資:
範例 1:
輸入: n = 4, connections = [[0,1],[0,2],[1,2]]
輸出: 1
解釋: 移除電腦 1 和 2 之間的網路線,將其設置到電腦 1 和 3 之間。

範例 2:
輸入: n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]
輸出: 2

範例 3:
輸入: n = 6, connections = [[0,1],[0,2],[0,3],[1,2]]
輸出: -1
解釋: 網路線不夠用。


解題思維:
首先如果 connections.length < n - 1,則不管如果重新排列這些網路線,所有電腦就是不可能相連在一起。因為 n 個「點」需要 n - 1 條「線」才能全部連成一塊(每條「線」連著兩個點,因此從某個「點」開始延展,每條「線」將會連到一個新的「點」)。

也因此,如果多於 n - 1 條「邊」則代表有一些邊是不必要的。對於本題來說,這些不必要的邊即可以移植到其他地方來連接其他電腦。



因此排除了以上情況之後,剩下就很單純了——利用深度優先搜尋(Depth First Search,DFS)來找到現在有多少個各自相連的、但彼此不互連的「團體」(類似這題)。

假設有 C 個這樣子的「團體」,則可以看到我們的目標就是讓這 C 個「團體」合而為一,而按照類似於上面的論述,每條邊可以「多連到一個團體」,因此我們只需要 C - 1 條網路線來將這些電腦連在一起。

因此回傳 C - 1 即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作