玩家分享《怪物獵人崛起》試玩體驗沙雕動畫 艾露貓失寵記?
阿新 • • 發佈:2021-01-30
用乙太網線纜將 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]
- 沒有重複的連線。
- 兩臺計算機不會通過多條線纜連線。
解答
並查集,線上纜足夠的情況下,需要操作的次數等於獨立的連通分量個數減一:
class DSU {
public:
vector<int> parent;
vector<int> rank;
int n;
DSU(int n) : n(n) {
rank.resize(n, 1);
parent.resize(n);
for(int i = 0; i < n; i++ ){
parent[i] = i;
}
}
int find(int i){
if(i != parent[i]){
int temp = find(parent[i]);
parent[i] = temp;
}
return parent[i];
}
void merge(int i, int j){
int pi = find(i);
int pj = find(j);
if(pi != pj){
if(rank[pi] > rank[pj]){
swap(pi, pj);
}
parent[pi] = pj;
}
return;
}
};
class Solution {
public:
int makeConnected(int n, vector<vector<int>>& connections) {
if(connections.size() < n - 1)
return -1;
DSU dsu(n);
for(auto& c : connections){
dsu.merge(c[0], c[1]);
}
int cnt = 0;
for(int i = 0; i < n; i++){
if(dsu.find(i) == i){
cnt++;
}
}
return cnt - 1;
}
};