1 吐槽:dijkstra算法音译成迪杰斯特拉。。。。。。
2算法:
某点与其他顶点的最小距离路径要么是与该顶点直接相连,要么经过已经生成的部分最小路径,然后与这个顶点相连。
直接相连的路径通过初始化权重数组完成,找到最小的边。用这个路径是去更新权重数组。再次找权重数组中未被选中的最小边,再次更新。。直到所有顶点都加入最小路径图中为止。
实际算法代码其实prim算法类似(原理不一样,prim是某时刻部分MST的顶点与外面顶点相连的最小边一定在MST中,dijkstra是与任意一点的最小路径不是直接相连就是经过已经找到的最小路径,原理证明也类似,都是反证法),prim算法找到部分MST中的顶点和外部顶点最小的边,选出来更新权重列表,选择最小的边并将顶点和边加入MST中,dijkstra算法找到最小的边与外部未存放在部分最小路径中的顶点的最小边,加入最小路径图,更新权重表,再次选择。
3 tips
邻接表由于在选择当次找到的最小路径的顶点是否与其他不在最小路径图中的顶点相连也要一个循环,因此最坏情况复杂度到了n的3次方。而邻接矩阵为平方。
代码:
package nuaa.ds;
public class MinPathOfGraph {
private CreateGraph g;
private String[] vertexes;//邻接矩阵法所
private int[][] vr; //使用的成员变量
private VertexNode[] vertexNodes;//邻接表所使用的成员变量
/**
* 无向图,G在中间外围一圈按行顺序ABCDEF,F最后连个H
* @param c
*/
public MinPathOfGraph(CreateGraph c){
this.g = c;
switch(g){
case AdjacencyMatrix://邻接矩阵
this.vertexes = new String[]{"A","B","C","D","E","F","G","H"};
vr = new int[8][8];
int max = Integer.MAX_VALUE;
//arcs都有权重
vr[0] = new int[]{0,13,21,max,max,max,3,max};//好
vr[1] = new int[]{13,0,max,25,max,max,34,max};
vr[2] = new int[]{21,max,0,max,7,max,5,max};
vr[3] = new int[]{max,25,max,0,max,18,