用以太網線纜將 n
臺計算機連接成一個網絡,計算機的編號從 0
到 n-1
。線纜用 connections
表示,其中 connections[i] = [a, b]
連接了計算機 a
和 b
。
網絡中的任何一臺計算機都可以通過網絡直接或者間接訪問同一個網絡中其他任意一臺計算機。
給你這個計算機網絡的初始佈線 connections
,你可以拔開任意兩臺直連計算機之間的線纜,並用它連接一對未直連的計算機。請你計算並返回使所有計算機都連通所需的最少操作次數。如果不可能,則返回 -1 。
示例 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 解釋:線纜數量不足。
示例 4:
輸入:n = 5, connections = [[0,1],[0,2],[3,4],[2,3]] 輸出:0
提示:
1 <= n <= 10^5
1 <= connections.length <= min(n*(n-1)/2, 10^5)
connections[i].length == 2
0 <= connections[i][0], connections[i][1] < n
connections[i][0] != connections[i][1]
- 沒有重複的連接。
- 兩臺計算機不會通過多條線纜連接。
思路:並查集求聯通塊,答案爲聯通塊數目-1,如果連邊小於n-1則輸出-1
class Solution {
public:
int f[100005],cnt[100005];
int fa(int x)
{
return f[x]==x?x:f[x]=fa(f[x]);
}
int makeConnected(int n, vector<vector<int>>& connections) {
if(connections.size()<n-1)return -1;
int ans=0;
for(int i=0;i<n;i++)f[i]=i;
for(int i=0;i<connections.size();i++)
{
int x=connections[i][0],y=connections[i][1];
f[fa(x)]=fa(y);
}
for(int i=0;i<n;i++)cnt[fa(i)]++;
for(int i=0;i<n;i++)
{
if(cnt[i])ans++;
}
//for(int i=0;i<n;i++)cout<<f[i]<<endl;
return ans-1;
}
};