最小生成树
说明
这里不会对原理进行详细的分析讲解,只说构建的过程
这里假设所有的图的所有节点都是连通了,不会是非
最小生成树的构建过程最关键的就是对于成环的判断
使用的图
Kruskal算法
边集合数据结构
//边集合
edges = []
//边集合中元素
function node(start, end, weight) {
this.start = start;
this.end = end;
this.weight = weight;
}
伪代码
//edges.sort();
边集合排序
选择权重最小的边
while(选中的边数 < 点数){
if(是安全边){
选中这个边
开始点和结束点加入已选中中
}
}
//安全边检测
//原理:对于每个点来说,加入集合就是集合中一个点指向这个点,如果这个点本来就是集合中的,那么集合就会成环,所以安全边就是要让这个边的两个点不在一个集合中
//设置一个集合数组记录已有的集合
if(开始点和结束点都未使用){
两个一起形成新集合
}else if(开始点和结束点有一个是集合中的){
新加入的点进入大集合中
}else if(开始点和结束点都是在集合中但是不在一个集合){
让结束点集合合并到开始点中
}
边的选择和集合生成过程
这里的图用的是一个公众号的图,不用作商业用途,如有冒犯,万分抱歉
实现代码
数据
//这里是九个点
//edges是边集,这里有15条边
var NumNodes = 9;
var NumEdges = 15;
var start = [4, 2, 0, 0, 1, 3, 1, 5, 1, 6, 3, 3, 2, 3, 4];
var end = [7, 8, 1, 5, 8, 7, 6, 6, 2, 7, 4, 8, 3, 6, 5];
var weight = [1, 2, 3, 4