题解 | #最小生成树#

最小生成树

https://www.nowcoder.com/practice/735a34ff4672498b95660f43b7fcd628

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回最小的花费代价使得这n户人家连接起来
 * @param n int整型 n户人家的村庄
 * @param m int整型 m条路
 * @param cost int整型二维数组 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价
 * @return int整型
 */
function miniSpanningTree( n ,  m ,  cost ) {
    // write code here
    // 按照权重排序
    cost.sort((a,b) => a[2]-b[2]);
    let parentArr = [];
    // 初始化父节点
    for(let i = 0; i < n; i++) {
        parentArr[i] = -1;
    }

    // 获取父节点
    const setParent = (i) => {
        if(parentArr[i] !== -1) {
            return parentArr[i];
        }
        return i;
    }

    // 是否成环
    const ifCircle = (startParentIndex,endParentIndex) => {
        if(startParentIndex !== endParentIndex) {
            // 正常处理线的2个顶点为并查集
            parentArr[endParentIndex] = startParentIndex;
            
            // 如果存在多个endParentIndex为父节点的节点处理
            let indexArr = [];
            for(index in parentArr) {
                if(parentArr[index] === endParentIndex) {
                    indexArr.push(index);
                }
            }
            indexArr.forEach(index => parentArr[index] = startParentIndex);
            return false;
        }else {
            return true;
        }
    }

    // 实现获取最短路径的算法
    let res = []
    for(let i = 0; i < cost.length; i++) {
        let startIndex = cost[i][0]-1;
        let endIndex = cost[i][1]-1;

        let startParentIndex = setParent(startIndex);
        let endParentIndex = setParent(endIndex);

        if(!ifCircle(startParentIndex, endParentIndex)) {
            res.push(cost[i])
        }
    }
    console.log(res);
    return res.map(v => v[2]).reduce((a,b) => a + b, 0);
}
module.exports = {
    miniSpanningTree : miniSpanningTree
};

全部评论

相关推荐

07-24 19:01
门头沟学院 Java
后天笔试,又要开始做题了
Sairus:明天10:00笔试
投递京东等公司10个岗位
点赞 评论 收藏
分享
你是我的最优解L:这题是不是优化快排就能解出来?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务