记录 1 道算法题
连通网络的操作次数
会提供一个 n 个计算机,和一个连接线的数组。其中有一些是重复的。大概的做法是重新连一遍,然后剩下的就是多余的边。然后修改多余的边的次数就是剩余多少边。
使用并查集来解题
function makeConnected(n, connections) {
const k = connections.length
// 连接 n 台电脑至少要 n-1 条边,
// 给的能修改的边的数量不足就返回 -1。
if (n - k > 1) return -1
const parent = Array.from(new Array(n), (_,i) => i)
const size = new Array(n).fill(1)
// 使用 --,重新连接一个就减 1
let count = n
for(let i = 0; i < k; i++) {
const [a,b] = connections[i]
// 重新连接一遍
let n1,n2
if ((n1 = find(parent, a)) !== (n2 = find(parent, b))) {
// size 是收集每一个集合的等级,等级高合并等级低。
// 如果不一定由等级高合并等级低的话,
// parent[n1] = n2 可以直接进行合并
if (size[n2] > size[n1]) {
const t = n2
n2 = n1
n1 = t
}
parent[n2] = n1
size[n1] += size[n2]
count--
}
}
// 多出一个要减去
return count - 1
}
function find(parent, i) {
if (parent[i] !== i) {
parent[i] = find(parent, parent[i])
}
return parent[i]
}
结束