题解 | #最小生成树#
最小生成树
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
};


查看14道真题和解析