public class DijkstraSP { //索引代表顶点,值表示从顶点s到当前顶点的最短路径上的倒数第二个顶点 private int[] edgeTo; //索引代表顶点,值从顶点s到当前顶点的最短路径的总权重 private double[] distValue; //是否做了标记,加入树中 private boolean[] marked; //构造方法 //根据一副加权有向图G和顶点s,创建一个计算顶点为s的最短路径树对象 public DijkstraSP(EdgeWeightedDigraph G, int topPoint) { int pointNum = G.V(); System.out.println("pointNum: "+pointNum); if (topPoint>pointNum-1){ throw new Error("超出范围"); } //创建一个和图的顶点数一样大小数组,表示从顶点s到当前顶点的最短路径上的倒数第二个顶点 this.edgeTo = new int[pointNum]; Arrays.fill(edgeTo, -1); //初始化都没有,除了顶点 edgeTo[topPoint] = topPoint; //创建一个和图的顶点数一样大小的double数组,表示权重,并且初始化数组中的内容为无穷大,无穷大即表示不存在这样的边 this.distValue = new double[pointNum]; Arrays.fill(distValue, Double.POSITIVE_INFINITY); distValue[topPoint] = 0.0; //到顶点自身的距离了为0 //marked初始化 this.marked = new boolean[G.V()]; int minPoint = 0; for (int i = (topPoint + 1) % pointNum; i != topPoint; i = (i + 1) % pointNum) { double minDist = Double.POSITIVE_INFINITY;//每次要重置最小值 //求出 distValue中最短的路径,即最小值 for (int j = 0; j < pointNum; j++) { if (!marked[j]&&distValue[j]<minDist){ minDist = distValue[j]; minPoint = j; } } if (minDist == Double.POSITIVE_INFINITY){ break; } marked[minPoint] = true;//将点加入树,标记 //遍历他的邻接表,更新distValue,更新邻接表中顶点的上一个顶点为该顶点 for (DirectedEdge e : G.adj(minPoint)){ //获取边e的终点 int w = e.to(); if (!marked[w]&&minDist + e.weight()<distValue[w]){ distValue[w] = minDist + e.weight(); edgeTo[w] = minPoint; } } } } public double[] getDistValue(){ return distValue; } public int[] getEdgeTo(){ return edgeTo; } public boolean[] getMarked(){ return marked; } //判断从顶点s到顶点v是否可达 public boolean hasPathTo(int v){ return distValue[v]<Double.POSITIVE_INFINITY; }}