js图的数据结构处理----普里姆算法
2018-06-26 17:06 muamaker 阅读(460) 评论(0) 收藏 举报//求加权无向连通图的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())
相对应的还有:克鲁斯卡尔算法
浙公网安备 33010602011771号