Class JohnsonShortestPaths<V,​E>

  • Type Parameters:
    V - the graph vertex type
    E - the graph edge type
    All Implemented Interfaces:
    ShortestPathAlgorithm<V,​E>

    public class JohnsonShortestPaths<V,​E>
    extends Object
    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
    • Field Detail

      • GRAPH_CONTAINS_A_NEGATIVE_WEIGHT_CYCLE

        protected static final String GRAPH_CONTAINS_A_NEGATIVE_WEIGHT_CYCLE
        Error message for reporting the existence of a negative-weight cycle.
        See Also:
        Constant Field Values
      • GRAPH_MUST_CONTAIN_THE_SOURCE_VERTEX

        protected static final String GRAPH_MUST_CONTAIN_THE_SOURCE_VERTEX
        Error message for reporting that a source vertex is missing.
        See Also:
        Constant Field Values
      • GRAPH_MUST_CONTAIN_THE_SINK_VERTEX

        protected static final String GRAPH_MUST_CONTAIN_THE_SINK_VERTEX
        Error message for reporting that a sink vertex is missing.
        See Also:
        Constant Field Values
      • graph

        protected final Graph<V,​E> graph
        The underlying graph.
    • Constructor Detail

      • JohnsonShortestPaths

        public JohnsonShortestPaths​(Graph<V,​E> graph)
        Construct a new instance.
        Parameters:
        graph - the input graph
      • JohnsonShortestPaths

        public JohnsonShortestPaths​(Graph<V,​E> graph,
                                    double epsilon)
        Construct a new instance.
        Parameters:
        graph - the input graph
        epsilon - tolerance when comparing floating point values
    • Method Detail

      • getPath

        public GraphPath<V,​E> getPath​(V source,
                                            V sink)
        Get a shortest path from a source vertex to a sink vertex.
        Parameters:
        source - the source vertex
        sink - 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 graph
        NegativeCycleDetectedException - in case a negative weight cycle is detected
      • getPathWeight

        public double getPathWeight​(V source,
                                    V sink)
        Get the weight of the shortest path from a source vertex to a sink vertex. Returns Double.POSITIVE_INFINITY if no path exists.
        Specified by:
        getPathWeight in interface ShortestPathAlgorithm<V,​E>
        Parameters:
        source - the source vertex
        sink - 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
      • createEmptyPath

        protected final GraphPath<V,​E> createEmptyPath​(V source,
                                                             V sink)
        Create an empty path. Returns null if the source vertex is different than the target vertex.
        Parameters:
        source - the source vertex
        sink - the sink vertex
        Returns:
        an empty path or null null if the source vertex is different than the target vertex