//最小生成树的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成正比。