js版本图的最小生成树的prim算法的即时实现

//最小生成树的prim算法的延时实现

//(从边有权重开始)pq和mst保存的是边,以前都是保存点
//pq应该用优先队列实现,这里取巧用js自带的api了
function deleteMin(pq){
    pq.sort(randomsort)
    return pq.shift()
}
function randomsort(a,b){return a[2]<b[2]?-1:1}


function primMST(G){
    while(pq.length>0){
        var e=deleteMin(pq)
        //console.log(e,"pq->",pq)
        let w=e[1]
        if(!marked[w]){
            mst.push(e)
            visit(w,G)
        }
    }
}

//注意这里的pq和mst里的和G里拿到的e不一样。G的e是[w,length],pq和mst里的是[v,w,length]。
function visit(v,G){
    marked[v]=true
    for(let j in G[v]){
        let e=G[v][j]
        let w=e[0]
        let len=e[1]
        if(marked[w]){continue}
        if(len<length[w]){
            length[w]=len
            from[w]=v
            pq.push([v,w,len])        //这里和书上的代码不一样,因为js不好实现change替换,详情见截图。
        }
    }
}


//书上没有mst,用from和length即可记录最小生成树,此时pq里保存的e用[w,length]即可。
let generateGraph=require('./wgraph').generateGraph
let generateEdges=require('./wgraph').generateEdges
var V=555
console.log(es=generateEdges(V,V*3))
console.log("G-->",G=generateGraph(V,es,false))
var marked=[]
var length=[0]
var from=[]
let longestLength=Math.pow(2,31)-1
for(let i=1;i<V;i++){length.push(longestLength)}
var mst=[]
var pq=[]
pq.push([0,0,0])
primMST(G)
console.log(marked,"\n",mst)
console.log(length,"\n",from)

在这里插入图片描述
在这里插入图片描述
延时实现把v和没被标记的w之间的e全部加入pq,所以空间复杂度和E成正比;
即时实现把v和没被标记的w之间的小于length[w]加入pq,所以对于任意w最多只有一个包含它的e在pq里,空间复杂度和V成正比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值