定义
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
如图所示,我们要求解V0到V8的最小权值及最短路径,这是我们经常碰到的求最小路径问题之一。通过一步就将最短权值和路径求出是不现实的,不过我们可以通过迪杰斯特拉算法,将所有点及个点之间的权值转换为矩阵,也就是二维数组,然后逐步求出最短路径即可。
二维矩阵数组如下图:
TS代码如下:
class Dikastra{
private arc:Array<any> = [];
private numVertexes = 0; //顶点数
private vexs:Array<string> = []; //顶点表
private pathmatirx:Array<number> = []; // 用于存储最短路径下标的数组,下标为各个顶点,值为下标顶点的前驱顶点
private shortPathTable:Array<number> = []; //用于存储到各点最短路径的权值和
private final:Array<any> = []; //用于标记V0到V8每个点是否找到了最短路径
/**
* 生成V0 到 V8 顶点
*/
private createVertexs(){
for(let i=0;i<this.numVertexes;i++){
this.vexs.push('V' + i);
}
}
/**
* 初始化状态标记及最短路径表
*/
private initTables(){
this.final.length = this.pathmatirx.length = this.shortPathTable.length = 0;
for (let v = 0; v < this.numVertexes; v++) {
this.final[v] = v === 0 ? 1 : 0; //V0默认是已找到最短路径状态
this.shortPathTable[v] = v === 0 ? 0 : this.arc[0][v]; //V0自己到自己是0
this.pathmatirx[v] = 0;
}
}
/**
* 执行迪杰斯特拉算法
*/
private dijkstra(){
let k:number; //当前找到的最近路线上的最后一个顶点,通过此顶点去找最近路线上的下一个顶点
let min:number; //到当前顶点的最小权值,65535意味着相距无穷大(不挨着初始时距离权值是无穷大)
for (let v = 1; v < this.numVertexes; v++) {
//初始化数据
min = 65535;
for (let w = 0; w < this.numVertexes; w++) {
//寻找离V0最近的顶点
if (!this.final[w] && this.shortPathTable[w] < min) {
k = w;
min = this.shortPathTable[