//求加权无向连通图的MST的贪心算法 //最小树,最小路径联通各个点
function PRIM(){ var graph = [ [], [undefined,Infinity, 23 ,Infinity,Infinity,Infinity, 28 ,36], [undefined, 23 ,Infinity, 20 ,Infinity,Infinity,Infinity,1], [undefined,Infinity, 20 ,Infinity, 15 ,Infinity,Infinity,4], [undefined,Infinity,Infinity, 15 ,Infinity, 3 ,Infinity,9], [undefined,Infinity,Infinity,Infinity, 3 ,Infinity, 17 ,16], [undefined, 28 ,Infinity,Infinity,Infinity, 17 ,Infinity,25], [undefined, 36 , 1 , 4 , 9 , 16 , 25 ,Infinity] ]; this.prim = function(u){ var n = graph.length; var s = []; var closest = []; var lowcost = []; u = u || 1 ; //初始化集合U的,第一个点为1 for(var i = 1 ; i < n; i++ ){ s[i] = false; //初始化为,未加入 closest[i] = u; //初始化的时候,v-u集合的所有点,都到第一个点距离最短 lowcost[i] = graph[u][i];//距离 } s[u] = true; closest[u] = -1; lowcost[u] = 0; //开始计算 for(var i = 1 ; i < n ; i++){ //寻找最近点 var t = u; var temp = Infinity; for(var j = 0; j < n ; j++){ if(lowcost[j] < temp && !s[j]){ temp = lowcost[j]; t = j; } } if(t == u){ break; } s[t] = true; //将t收集进入 U集合 for(var j = 1; j < n; j++){ if(!s[j] && lowcost[j] > graph[t][j]){ lowcost[j] = graph[t][j]; //更新最小距离,进过t接入 closest[j] = t; //记录前溯点 } } } return { u, closest, lowcost } } } //u集合表示已经确定节点,v-u表示未确定的节点 //s[i]为true表示i已经加入u集合 //closest[j],为集合v-u中的,点j到集合u中的最近点i,closest[j] = i; //lowcost[j],为集合v-u中的,点j到集合u中的最近点i的距离 //等式成立: map[j][closest[j]] = lowcost[j]; //2、初始化 集合u为1,数组,closet = [], lowcost = [], s = []; //3、在lowcost中找最小值lowcost[t],则点t就是集合u到集合v-u的最近点 //4、将t加入集合u //5、如果集合v-u,结束。否则执行6 //6、对集合v-u中的所有点,更新 lowcost和closest, //更新方式: if(map[t][j] < lowcost[j]){lowcost[j] = map[t][j]; castset[j]=t; } //重复执行3 var prim = new PRIM(); console.log(prim.prim())
相对应的还有:克鲁斯卡尔算法