var max = 1000000;
var pointSet = [];
var distance = [
[0, 4, 7, max, max],
[4, 0, 8, 6, max],
[7, 8, 0, 5, max],
[max, 6, 5, 0, 7],
[max, max, max, 7, 0]
];
function Node(value) {
this.value = value;
this.neighbor = [];
}
var a = new Node("A");
var b = new Node("B");
var c = new Node("C");
var d = new Node("D");
var e = new Node("E");
pointSet.push(a);
pointSet.push(b);
pointSet.push(c);
pointSet.push(d);
pointSet.push(e);
// 获取节点序号
function getIndex(str) {
for (var i = 0; i < pointSet.length; i++) {
if (str == pointSet[i].value) return i;
}
return -1
}
// 需要传入点的集合,边的集合,当前已经接入的集合
// 此方法,根据当前已经有的节点,来进行判断,获取到距离最短的点
function getMinDisNode(pointSet, distance, nowPointSet) {
var fromNode = null; // 线段的起点
var minDisNode = null; // 线段的终点
var minDis = max;
// 根据当前已有的这些点为起点,依次判断连接其他的点的距离是多少
for (var i = 0; i < nowPointSet.length; i++) {
var nowPointIndex = getIndex(nowPointSet[i].value); // 获取当前节点的序号
for (var j = 0; j < distance[nowPointIndex].length; j++) { // 遍历当前节点的数据
var thisNode = pointSet[j]; // 获取当前点到各个点的距离
if (nowPointSet.indexOf(thisNode) < 0 // 首先这个点不能是已经介入的点,indexOf:找到返回-1,-1 < 0 返回true
&& distance[nowPointIndex][j] < minDis) { // 其次点之间的距离是目前最短的
fromNode = nowPointSet[i]; // 起始点
minDisNode = thisNode; // 目标点
minDis = distance[nowPointIndex][j]; // 最短距离
}
}
}
fromNode.neighbor.push(minDisNode); // 把起始点和目标点连接起来
minDisNode.neighbor.push(fromNode); // 把目标点和起始点连接起来
return minDisNode; // 返回已经连接的目标点
}
function prim(pointSet, distance, start) {
var nowPointSet = [];
nowPointSet.push(start); // 创建当前节点
// 获取最小距离的边
while (true) {
var minDisNode = getMinDisNode(pointSet, distance, nowPointSet); // 得到传过来的目标点
nowPointSet.push(minDisNode); // 向新的集合里添加连接的目标点
if (nowPointSet.length == pointSet.length) { // 当新的集合(最短连接路径已经连接成功),等于旧的集合长度表示已经都连上了
break;
}
}
}
prim(pointSet, distance, pointSet[2]);
console.log(pointSet)
哪里不对望各位在评论区改正