1. 示例:
根据如下的有权无向图寻找最小生成树。
2. 基本思想
1 将起始结点存入集合U中;
2 设置集合S为空;
3 如下迭代计算,直至访问完所有结点:
3.1 访问集合U中的结点u;
3.2 将最小邻边权值的边存入集合S;
3.3 将最小邻边权值的邻结点存入集合U;
3.4 如果u的邻结点不属于集合U且邻边的权值更小,则记录该邻结点及其邻边权值;
4 返回集合S.
3. js实现
// 最小生成树:生成Prim算法
function Prim(start){
v_num = 7;
G = [[-1,2,4,1,-1,-1,-1],[2,-1,-1,3,10,-1,-1],[4,-1,-1,2,-1,5,-1],[1,3,2,-1,7,8,4],[-1,10,-1,7,-1,-1,6],[-1,-1,5,8,-1,-1,1],[-1,-1,-1,4,6,1,-1]];
visit=new Array(v_num).fill(-1);
Tree=new Array();
Edges=new Array();
Tree.push(start); /* 起始结点存入集合Tree */
visit[start]=1; /* 起始结点已经存入Tree中 */
while(Tree.length<v_num){ /* 当Tree的长度小于结点数时 */
dist=-1; /* 初始权值为-1,即权值无穷大,代表两结点没有邻边 */
edge=new Array(2);
for(i=0;i<Tree.length;i++){ /* 遍历访问Tree中结点 */
for(j=0;j<v_num;j++){ /* 遍历访问图G中所有节点 */
if(visit[j]==-1&&G[j][Tree[i]]!=-1){ /* 如果 结点j不属于Tree且和结点Tree[i]有邻边 */
if(dist==-1||G[j][Tree[i]]<dist){ /* 当邻边权值更小时,记录相关信息 */
dist=G[j][Tree[i]];
edge[0]=Tree[i];
edge[1]=j;
}
}
}
}
if(dist!=-1){ /* 找到新的邻结点 */
Tree.push(edge[1]);
Edges.push(edge);
visit[edge[1]]=1;
}else{
break;
}
}
console.log(Tree);
console.log(Edges);
return Edges;
}
console.log(Prim(0));