迪杰斯特拉算法
迪杰斯特拉算法用于求图中的单源最短路劲,所谓单源最短路劲,是指从图中的某一个顶点出发,这个顶点到图中的其它节点的最短路劲。
迪杰斯特拉算法的主要思想如下:
- 将图中的节点分成两个集合:一个集合表示已经求出最短路劲的顶点集合,另一个集合表示还未求出到起点最短距离的顶点集合,初始未求出集合为空。
- 从未求出集合中选取一个距离最小的节点,并将其加入到已求出集合中
- 更新未求出集合中顶点到起点的最短距离:核心不等式:d[i] > graph[m][i]+d[m]。d[i]表示节点i到起点的最小距离。节点i的最小距离是直接到起点的距离和从i到m在到起点二者中的较小值。
- 重复2、3直到所有点都被加入到了已求出最小距离的集合中。
假设起点为start,用visited数组区别两个集合(也可以用两个线性表分别表示),visited[i]==true表示该节点已被加入到已计算出最小距离的集合,算法实现分成步:
- 初始化最小数组d,如果start、i连通,那么d[i]=graph[start][i],否则d[i]=Number.MAX_VALUE(表示不连通)
- 从数组d中选择一个最小值(可以用线性查找、也可以用优先队列,这里给出的代码是线性查找),将其加入到已计算集合中
- 更新未计算集合中的其他顶点到start的距离
- 重复2、3直到没有未计算出最小距离的连通节点
TypeScript代码实现如下:
export function dijkstra(graph:Array<Array<number>>, start:number):Array<number> {
let visited = new Array(graph.length); // 用于判断一个节点是不是已经在已计算的集合中,如果是,返回true
let d = new Array(graph.length); // 每一个节点到初始节点的最小距离
// 初始化d,如果边是0表示不连通,值为无穷
for(let i = 0;i<d.length;i++) {
d[i] = graph[start][i]==0?Number.MAX_VALUE:graph[start][i];