
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
//如此重复操作,不断更新最小距离
原文:https://www.cnblogs.com/muamaker/p/9210379.html