Shu-How Zの小窝

Loading...

1319.连通网络的操作次数

1319.连通网络的操作次数

2:24

// 定义并查集类
class UnionFind{
   // 构造函数初始化并查集
   constructor(n){
       this.parent = new Array(n).fill(0).map((item,index)=>index)
       this.rank = new Array(n).fill(1)
       this.count = n
   }
   // 查找元素的根节点
   find(x){
       if(this.parent[x] !== x){
           this.parent[x] = this.find(this.parent[x])
       }
       return this.parent[x]
   }
   // 合并两个集合
   union(x,y){
       let rootX = this.find(x)
       let rootY = this.find(y)
       if(rootX === rootY){
           return false
       }
       if(this.rank[rootX] < this.rank[rootY]){
           this.parent[rootX] = rootY
           this.rank[rootY] += this.rank[rootX]
       }else{
           this.parent[rootY] = rootX
           this.rank[rootX] += this.rank[rootY]
       }
       this.count--
   }
   // 判断两个元素是否属于同一个集合
   connected(x,y){
       return this.find(x) === this.find(y)
   }
   // 获取集合的数量
   getCount(){
       return this.count
   }
}
/**
* 计算最少操作次数以使所有计算机相连
* @param {number} n - 计算机的数量
* @param {Array} connections - 计算机之间的连接数组
* @return {number} - 返回使所有计算机相连所需的最少操作次数
*/
var makeConnected = function(n, connections) {
   // 检查连接数是否至少为n-1,这是连接所有计算机的最小要求
   if(connections.length < n - 1) return -1;
   
   // 创建并查集对象,用于管理计算机之间的连接关系
   let uf = new UnionFind(n);
   
   // 遍历所有连接,将相连的计算机合并到同一个集合中
   for(let [x, y] of connections){
       uf.union(x, y);
   }
   
   // 返回使所有计算机相连所需的最少操作次数
   // 这里减去1是因为最终只会剩下uf.getCount()个独立的集合
   return uf.getCount() - 1;
};

2

posted @ 2025-04-26 19:46  KooTeam  阅读(11)  评论(0)    收藏  举报