java.lang.Object
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.
- Author:
- Dimitrios Michail
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.jgrapht.alg.interfaces.ShortestPathAlgorithm
ShortestPathAlgorithm.SingleSourcePaths<V,
E> -
Field Summary
Modifier and TypeFieldDescriptionThe underlying graph.protected static final String
Error message for reporting the existence of a negative-weight cycle.protected static final String
Error message for reporting that a sink vertex is missing.protected static final String
Error message for reporting that a source vertex is missing. -
Constructor Summary
ConstructorDescriptionJohnsonShortestPaths
(Graph<V, E> graph) Construct a new instance.JohnsonShortestPaths
(Graph<V, E> graph, double epsilon) Construct a new instance. -
Method Summary
Modifier and TypeMethodDescriptioncreateEmptyPath
(V source, V sink) Create an empty path.Get a shortest path from a source vertex to a sink vertex.Compute all shortest paths starting from a single source vertex.double
getPathWeight
(V source, V sink) Get the weight of the shortest path from a source vertex to a sink vertex.
-
Field Details
-
GRAPH_CONTAINS_A_NEGATIVE_WEIGHT_CYCLE
Error message for reporting the existence of a negative-weight cycle.- See Also:
-
GRAPH_MUST_CONTAIN_THE_SOURCE_VERTEX
Error message for reporting that a source vertex is missing.- See Also:
-
GRAPH_MUST_CONTAIN_THE_SINK_VERTEX
Error message for reporting that a sink vertex is missing.- See Also:
-
graph
The underlying graph.
-
-
Constructor Details
-
JohnsonShortestPaths
Construct a new instance.- Parameters:
graph
- the input graph
-
JohnsonShortestPaths
Construct a new instance.- Parameters:
graph
- the input graphepsilon
- tolerance when comparing floating point values
-
-
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_INFINITY
if no path exists.- Specified by:
getPathWeight
in interfaceShortestPathAlgorithm<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_INFINITY
if 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:
getPaths
in interfaceShortestPathAlgorithm<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
-
createEmptyPath
Create an empty path. Returns null if the source vertex is different than the target vertex.- Parameters:
source
- the source vertexsink
- the sink vertex- Returns:
- an empty path or null null if the source vertex is different than the target vertex
-