AcyclicSP.java
package cn.denghanxi.s44;
import cn.denghanxi.s42.Topological;
import edu.princeton.cs.algs4.Stack;
/**
* 计算加权有向无环图源点最短路径
*/
public class AcyclicSP {
private DirectedEdge[] edgeTo;
private double[] distTo;
public AcyclicSP(EdgeWeightedDigraph graph, int s) {
edgeTo = new DirectedEdge[graph.v()];
distTo = new double[graph.v()];
for(int i = 0; i < graph.v(); i++) {
distTo[i] = Double.POSITIVE_INFINITY;
}
distTo[s] = 0.0;
Topological topological = new Topological(graph);
for (int v : topological.getOrder())
relax(graph, v);
}
public double distTo(int v) {
return distTo[v];
}
public boolean hasPathTo(int v) {
return distTo[v] < Double.POSITIVE_INFINITY;
}
public Iterable<DirectedEdge> pathTo(int v) {
if (!hasPathTo(v)) return null;
Stack<DirectedEdge> path = new Stack<>();
for (DirectedEdge e = edgeTo[v]; e != null; e = edgeTo[e.from()]) {
path.push(e);
}
return path;
}
private void relax(EdgeWeightedDigraph graph, int v) {
for (DirectedEdge e : graph.adj(v)) {
int w = e.to();
if (distTo[w] > distTo[v] + e.weight()) {
distTo[w] = distTo[v] + e.weight();
edgeTo[w] = e;
}
}
}
}