Leetcode刷題筆記 1319. 連通網路的操作次數
阿新 • • 發佈:2021-01-24
技術標籤:leetcode
1319. 連通網路的操作次數
知識點:並查集
時間:2021年1月23日
題目連結
題目
用乙太網線纜將 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 > 線的個數 肯定連線不了
- 否則把所有的線連起來後 看有幾個連通分量
- 需要的線就是連通分量個數-1
程式碼
#include "cheader.h"
class Solution {
public:
struct UN{
vector<int> ancestor;
UN(int x){
ancestor.resize(x);
for(int i = 0; i < x;i++)
ancestor[i] = i;
}
int find(int x){
if(ancestor[x] == x)
return x;
else
return ancestor[x] = find(ancestor[x]);
}
void merge(int x,int y){
ancestor[find(x)] = ancestor[find(y)];
}
};
int makeConnected(int n, vector<vector<int>>& connections) {
UN un = UN(n);
int m = connections.size();
if(n-1 > m)
return -1;
for(int i = 0; i < m; i++){
int x = connections[i][0];
int y = connections[i][1];
if(un.find(x) != un.find(y))
un.merge(x, y);
}
int ans = 0;
for(int i = 0; i < n; i++){
if(un.find(i) == i)
ans++;
}
return --ans;
}
};
int main()
{
int n = 6;
vector<vector<int>> connections;
connections.push_back({0,1});connections.push_back({0,2});connections.push_back({0,3});
connections.push_back({1,2});connections.push_back({1,3});
Solution s;
cout<<s.makeConnected(n, connections)<<endl;
return 0;
}
今天也是愛zz的一天哦!