算法(第四版)423页
public class DijkstraSP{
private DirectedEdge[] edgeTo;
private double[] distTo;
private IndexMinPQ<Double> pq;
public DijkstraSP(EdgeWeightedDigraph G,int s){
//最后的最小路径树保存在 edgeTo之中
edgeTo=new DirectedEdge[G.V()];
//从s去到每个顶点的距离
distTo=new double[G.V()];
//总是删除最小的优先队列
//他的索引代表顶点,索引对应的值是路径长度
pq=new IndexMinPQ<Double>(G.V());
//刚开始的时候,s到每一个顶点的距离都是正无穷
for(int v=0;v<G.V();v++)
distTo[v]=Double.POSTIVE_INFINITY;
//从s到s的距离为0
distTo[s]=0.0;
//最开始优先队列中只有从s到s,且距离为0
pq.insert(s,0.0);
//
while(!pq.isEmpty){
relax(G,pq.delMin());//删除最小的元素,并且返回他的索引
}
}
private void relax(EdgeWeightedDigraph G,int v){
for(DirectedEdge e: G.adj(v)){//从v出发的每一条边e
int w=e.to();//w是e的终点,
if(distTo[w]>distTo[v]+e.weight()){//如果原本s去w的距离 比 s先到v再到w的距离 长
distTo[w]=distTo[v]+e.weight();//更新s到w的距离
edgeTo[w]=e;//到w最后的一条边
if(pq.contains(w)) pq.change(w,distTo[w]);//如果pq中没有w则加入w,
else pq.insert(w,distTo[w]);
}
}
}
public Iterable<DirectedEdge> pathTo(int v){
if(!hasPathTo(v)) return null;
Stack<DirectedEdge> path=new Stack<>();
for(DirectedEdge e=edgeTo[v];e!=null;e=e.edgeTo[e.form]){
path.push(e);
}
return path;
}
}