标签:更新 length .com 贪心算法 div min var image new
function Graph() { this.graph = [ [0, 2, 4, 0, 0, 0], [0, 0, 1, 4, 2, 0], [0, 0, 0, 0, 3, 0], [0, 0, 0, 0, 0, 2], [0, 0, 0, 3, 0, 2], [0, 0, 0, 0, 0, 0] ]; //迪杰斯特拉算法---贪心算法 this.dijkstra = function(src) { var dist = [], visited = [], length = this.graph.length; for(var i = 0; i < length; i++) { dist[i] = Infinity; visited[i] = false; // false表示未处理的顶点 } dist[src] = 0; //初始化顶点与自己的距离是0 for(var i = 0; i < length - 1; i++) { var u = minDistance(dist, visited); visited[u] = true; for(var v = 0; v < length; v++) { if(!visited[v] && this.graph[u][v] != 0 && dist[u] != Infinity && dist[u] + this.graph[u][v] < dist[v]) { //如果相邻的顶点,到这里的距离小于之前存的距离,则更新最小距离 dist[v] = dist[u] + this.graph[u][v]; } } } return dist; } function minDistance(dist, visited) { var min = Infinity, minIndex = -1; for(var v = 0; v < dist.length; v++) { if(visited[v] == false && dist[v] <= min) { min = dist[v]; minIndex = v; } } return minIndex; } } var gf = new Graph(); console.log(gf.dijkstra(0)); //graph[u][v] 表示两个顶点的距离, 例如 graph[1][2],表示B-C的距离,如果是0表示没有连接 //1、 初始化两个数组,dist表示各个点到指定点的距离,visited表示是否计算过该顶点周周围的顶点 //2、找出未计算的,最小距离,将自己标记为已经计算,然后遍历其周围没有计算过的顶点 //3、比较距离,更新距离 //例如: //1、初始化一个顶点为A,然后找其他顶点与A的距离 //此时:dist=[0,Infinity,Infinity,Infinity,Infinity,Infinity] // minDistance 计算出结果为 u = 0 // visited = [true,false,false,false,false,false] //2、 由于B和C都是未标记的,且距离是最小的,找到A的周围未标记的点B、C //此时: dist=[0,2,4,Infinity,Infinity,Infinity] // minDistance 计算出结果为 u = 1 //开始找B周围的点 // visited = [true,true,false,false,false,false] //3、由于D、E、C都是未标记的,所以B周围能找到,D、E、C //如此重复操作,不断更新最小距离
标签:更新 length .com 贪心算法 div min var image new
原文地址:https://www.cnblogs.com/muamaker/p/9210379.html