代码改变世界

js图的数据结构处理----普里姆算法

2018-06-26 17:06  muamaker  阅读(444)  评论(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())

  

 

相对应的还有:克鲁斯卡尔算法