[路飞] 连通网络的操作次数

101 阅读1分钟

记录 1 道算法题

连通网络的操作次数

leetcode-cn.com/problems/nu…


会提供一个 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]
    }

结束