图算法:有权无向图的最小生成树-Prim算法-js实现

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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值