按照 深入理解Dijkstra算法 去理解了一下数据结构课刚学的Dijkstra,尝试用JavaScript去实现,于此整理记录:
这是要实现最短路径查找的图:
源码如下(Css 和 HTML部分略);
let max = 10000;
//定义邻接矩阵
let arr = [
[0, 4, max, 2, max],
[4, 0, 4, 1, max],
[max, 1, 0, 1, 3],
[2, 1, 1, 0, 7],
[max, max, 3, 7, 0]
];
let pointNumber = 5; //顶点数
let lineNumber = 7; //边数
//创建图结构
function Graphy(pointNumber, lineNumber){
this.point = [];
this.arc = [];
this.pointNumber = pointNumber;
this.lineNumber = lineNumber;
}
var G = new Graphy(pointNumber, lineNumber);
//创建当前图
function creatGraphy(){
//定义顶点表
for(var i=0;i<pointNumber;i++){
G.point[i] = String.fromCharCode(65 + i);
}
//定义邻接矩阵
for(var i=0;i<pointNumber;i++){
G.arc[i] = [];
for(var j=0;j<pointNumber;j++){
G.arc[i][j] = arr[i][j];
}
}
}
//Dijindexstra算法实现
function showDisjindexstra(){
creatGraphy();
let S = []; // S集合包含已求出的最短路径的点(以及相应的最短长度)
let U = []; // U集合包含未求出最短路径的点(以及A到某点的路径)
//初始化S集合 A->A = 0
S[0] = 0;
//初始化U集合 A->A = 0 ; A->B = 4 ; A->C = MAX ......
for(var i=0;i<pointNumber;i++){
U[i] = G.arc[i][0];
}
//开始从U集合中找最短路径 并提交到S集合
function findRoad(){
for(var time=0;time<pointNumber;time++){
//找出此时U集合中第一个不为0的最小数
var minArr = U.filter(function(item){
return item > 0;
});
var min = minArr[0];
var index = null;
for(var i=1;i<U.length;i++){
if(U[i] > 0 && U[i] <= min){
min = U[i];
index = i;
}
}
S[index] = min;
//判断此时是否需要更新U集合
for(var i=1;i<pointNumber;i++){
if(G.arc[i][index] + U[index] < U[i]){
U[i] = G.arc[i][index] + U[index];
}
}
U[index] = 0;
}
}
findRoad();
//将最短路径输出
var c = document.getElementsByClassName("content");
console.log(S);
for(var i=0;i<pointNumber;i++){
c[i].innerHTML = S[i];
}
}
showDisjindexstra();
测试结果:
好像就整出来了,闲了换个图试试看~