Class JohnsonShortestPaths<V,E>
java.lang.Object
org.jgrapht.alg.shortestpath.BaseShortestPathAlgorithm<V,E>
org.jgrapht.alg.shortestpath.JohnsonShortestPaths<V,E>
- Type Parameters:
V- the graph vertex typeE- the graph edge type
- All Implemented Interfaces:
ShortestPathAlgorithm<V,E>
Johnson's all pairs shortest paths algorithm.
Finds the shortest paths between all pairs of vertices in a sparse graph. Edge weights can be negative, but no negative-weight cycles may exist. It first executes the Bellman-Ford algorithm to compute a transformation of the input graph that removes all negative weights, allowing Dijkstra's algorithm to be used on the transformed graph.
Running time is $O(n m + n^2 \log n)$.
Since Johnson's algorithm creates additional vertices, this implementation requires the user to provide a graph which is initialized with a vertex supplier.
In case the algorithm detects a negative weight cycle it will throw an exception of type
NegativeCycleDetectedException which will contain the detected negative weight cycle.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) classNested classes/interfaces inherited from interface ShortestPathAlgorithm
ShortestPathAlgorithm.SingleSourcePaths<V,E> -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final Comparator<Double> private double[][]private E[][]Fields inherited from class BaseShortestPathAlgorithm
graph, GRAPH_CONTAINS_A_NEGATIVE_WEIGHT_CYCLE, GRAPH_MUST_CONTAIN_THE_SINK_VERTEX, GRAPH_MUST_CONTAIN_THE_SOURCE_VERTEX -
Constructor Summary
ConstructorsConstructorDescriptionJohnsonShortestPaths(Graph<V, E> graph) Construct a new instance.JohnsonShortestPaths(Graph<V, E> graph, double epsilon) Construct a new instance. -
Method Summary
Modifier and TypeMethodDescriptioncomputeVertexIndices(Graph<V, E> g) Compute a unique integer for each vertex of the graphcomputeVertexWeights(Graph<V, E> g) Compute vertex weights for edge re-weighting using Bellman-Ford.Get a shortest path from a source vertex to a sink vertex.Compute all shortest paths starting from a single source vertex.doublegetPathWeight(V source, V sink) Get the weight of the shortest path from a source vertex to a sink vertex.private voidrun()Executes the actual algorithm.private voidGraph contains edges with negative weights.private voidGraph has no edges with negative weights.Methods inherited from class BaseShortestPathAlgorithm
createEmptyPath
-
Field Details
-
distance
private double[][] distance -
pred
-
vertexIndices
-
comparator
-
-
Constructor Details
-
JohnsonShortestPaths
-
JohnsonShortestPaths
-
-
Method Details
-
getPath
Get a shortest path from a source vertex to a sink vertex.- Parameters:
source- the source vertexsink- the target vertex- Returns:
- a shortest path or null if no path exists
- Throws:
IllegalArgumentException- in case the provided vertex factory creates vertices which are already in the original graphNegativeCycleDetectedException- in case a negative weight cycle is detected
-
getPathWeight
Get the weight of the shortest path from a source vertex to a sink vertex. ReturnsDouble.POSITIVE_INFINITYif no path exists.- Specified by:
getPathWeightin interfaceShortestPathAlgorithm<V,E> - Overrides:
getPathWeightin classBaseShortestPathAlgorithm<V,E> - Parameters:
source- the source vertexsink- the sink vertex- Returns:
- the weight of the shortest path from a source vertex to a sink vertex, or
Double.POSITIVE_INFINITYif no path exists - Throws:
IllegalArgumentException- in case the provided vertex factory creates vertices which are already in the original graph
-
getPaths
Compute all shortest paths starting from a single source vertex.- Specified by:
getPathsin interfaceShortestPathAlgorithm<V,E> - Overrides:
getPathsin classBaseShortestPathAlgorithm<V,E> - Parameters:
source- the source vertex- Returns:
- the shortest paths
- Throws:
IllegalArgumentException- in case the provided vertex factory creates vertices which are already in the original graphNegativeCycleDetectedException- in case a negative weight cycle is detected
-
run
private void run()Executes the actual algorithm. -
runWithPositiveEdgeWeights
-
runWithNegativeEdgeWeights
-
computeVertexWeights
-
computeVertexIndices
-