Package org.jgrapht.traverse
Class ClosestFirstIterator<V,E>
- java.lang.Object
-
- org.jgrapht.traverse.AbstractGraphIterator<V,E>
-
- org.jgrapht.traverse.CrossComponentIterator<V,E,FibonacciHeapNode<ClosestFirstIterator.QueueEntry<V,E>>>
-
- org.jgrapht.traverse.ClosestFirstIterator<V,E>
-
- Type Parameters:
V
- the graph vertex typeE
- the graph edge type
- All Implemented Interfaces:
java.util.Iterator<V>
,GraphIterator<V,E>
public class ClosestFirstIterator<V,E> extends CrossComponentIterator<V,E,FibonacciHeapNode<ClosestFirstIterator.QueueEntry<V,E>>>
A closest-first iterator for a directed or undirected graph. For this iterator to work correctly the graph must not be modified during iteration. Currently there are no means to ensure that, nor to fail-fast. The results of such modifications are undefined.The metric for closest here is the weighted path length from a start vertex, i.e. Graph.getEdgeWeight(Edge) is summed to calculate path length. Negative edge weights will result in an IllegalArgumentException. Optionally, path length may be bounded by a finite radius.
- Since:
- Sep 2, 2003
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static class
ClosestFirstIterator.QueueEntry<V,E>
Private data to associate with each entry in the priority queue.-
Nested classes/interfaces inherited from class org.jgrapht.traverse.CrossComponentIterator
CrossComponentIterator.SimpleContainer<T>, CrossComponentIterator.VisitColor
-
Nested classes/interfaces inherited from class org.jgrapht.traverse.AbstractGraphIterator
AbstractGraphIterator.DirectedSpecifics<VV,EE>, AbstractGraphIterator.FlyweightEdgeEvent<VV,localE>, AbstractGraphIterator.FlyweightVertexEvent<VV>, AbstractGraphIterator.Specifics<VV,EE>, AbstractGraphIterator.UndirectedSpecifics<VV,EE>
-
-
Field Summary
Fields Modifier and Type Field Description private FibonacciHeap<ClosestFirstIterator.QueueEntry<V,E>>
heap
Priority queue of fringe vertices.private boolean
initialized
private double
radius
Maximum distance to search.-
Fields inherited from class org.jgrapht.traverse.AbstractGraphIterator
nListeners, reusableEdgeEvent, reusableVertexEvent, specifics
-
-
Constructor Summary
Constructors Constructor Description ClosestFirstIterator(Graph<V,E> g)
Creates a new closest-first iterator for the specified graph.ClosestFirstIterator(Graph<V,E> g, V startVertex)
Creates a new closest-first iterator for the specified graph.ClosestFirstIterator(Graph<V,E> g, V startVertex, double radius)
Creates a new radius-bounded closest-first iterator for the specified graph.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
assertNonNegativeEdge(E edge)
private double
calculatePathLength(V vertex, E edge)
Determine weighted path length to a vertex via an edge, using the path length for the opposite vertex.private void
checkRadiusTraversal(boolean crossComponentTraversal)
private FibonacciHeapNode<ClosestFirstIterator.QueueEntry<V,E>>
createSeenData(V vertex, E edge)
The first time we see a vertex, make up a new heap node for it.protected void
encounterVertex(V vertex, E edge)
Update data structures the first time we see a vertex.protected void
encounterVertexAgain(V vertex, E edge)
Override superclass.double
getShortestPathLength(V vertex)
Get the weighted length of the shortest path known to the given vertex.E
getSpanningTreeEdge(V vertex)
Get the spanning tree edge reaching a vertex which has been seen already in this traversal.protected boolean
isConnectedComponentExhausted()
Returns true if there are no more uniterated vertices in the currently iterated connected component; false otherwise.protected V
provideNextVertex()
Returns the vertex to be returned in the following call to the iteratornext
method.void
setCrossComponentTraversal(boolean crossComponentTraversal)
Sets the cross component traversal flag - indicates whether to traverse the graph across connected components.-
Methods inherited from class org.jgrapht.traverse.CrossComponentIterator
finishVertex, getGraph, getSeenData, hasNext, isSeenVertex, next, putSeenData
-
Methods inherited from class org.jgrapht.traverse.AbstractGraphIterator
addTraversalListener, createGraphSpecifics, fireConnectedComponentFinished, fireConnectedComponentStarted, fireEdgeTraversed, fireVertexFinished, fireVertexTraversed, isCrossComponentTraversal, isReuseEvents, remove, removeTraversalListener, setReuseEvents
-
-
-
-
Field Detail
-
heap
private FibonacciHeap<ClosestFirstIterator.QueueEntry<V,E>> heap
Priority queue of fringe vertices.
-
radius
private double radius
Maximum distance to search.
-
initialized
private boolean initialized
-
-
Constructor Detail
-
ClosestFirstIterator
public ClosestFirstIterator(Graph<V,E> g)
Creates a new closest-first iterator for the specified graph.- Parameters:
g
- the graph to be iterated.
-
ClosestFirstIterator
public ClosestFirstIterator(Graph<V,E> g, V startVertex)
Creates a new closest-first iterator for the specified graph. Iteration will start at the specified start vertex and will be limited to the connected component that includes that vertex. If the specified start vertex isnull
, iteration will start at an arbitrary vertex and will not be limited, that is, will be able to traverse all the graph.- Parameters:
g
- the graph to be iterated.startVertex
- the vertex iteration to be started.
-
ClosestFirstIterator
public ClosestFirstIterator(Graph<V,E> g, V startVertex, double radius)
Creates a new radius-bounded closest-first iterator for the specified graph. Iteration will start at the specified start vertex and will be limited to the subset of the connected component which includes that vertex and is reachable via paths of weighted length less than or equal to the specified radius. The specified start vertex may not benull
.- Parameters:
g
- the graph to be iterated.startVertex
- the vertex iteration to be started.radius
- limit on weighted path length, or Double.POSITIVE_INFINITY for unbounded search.
-
-
Method Detail
-
setCrossComponentTraversal
public void setCrossComponentTraversal(boolean crossComponentTraversal)
Description copied from class:AbstractGraphIterator
Sets the cross component traversal flag - indicates whether to traverse the graph across connected components.- Overrides:
setCrossComponentTraversal
in classAbstractGraphIterator<V,E>
- Parameters:
crossComponentTraversal
- iftrue
traverses across connected components.
-
getShortestPathLength
public double getShortestPathLength(V vertex)
Get the weighted length of the shortest path known to the given vertex. If the vertex has already been visited, then it is truly the shortest path length; otherwise, it is the best known upper bound.- Parameters:
vertex
- vertex being sought from start vertex- Returns:
- weighted length of shortest path known, or Double.POSITIVE_INFINITY if no path found yet
-
getSpanningTreeEdge
public E getSpanningTreeEdge(V vertex)
Get the spanning tree edge reaching a vertex which has been seen already in this traversal. This edge is the last link in the shortest known path between the start vertex and the requested vertex. If the vertex has already been visited, then it is truly the minimum spanning tree edge; otherwise, it is the best candidate seen so far.- Parameters:
vertex
- the spanned vertex.- Returns:
- the spanning tree edge, or null if the vertex either has not been seen yet or is the start vertex.
-
isConnectedComponentExhausted
protected boolean isConnectedComponentExhausted()
Description copied from class:CrossComponentIterator
Returns true if there are no more uniterated vertices in the currently iterated connected component; false otherwise.- Specified by:
isConnectedComponentExhausted
in classCrossComponentIterator<V,E,FibonacciHeapNode<ClosestFirstIterator.QueueEntry<V,E>>>
- Returns:
- true if there are no more uniterated vertices in the currently iterated connected component; false otherwise.
- See Also:
CrossComponentIterator.isConnectedComponentExhausted()
-
encounterVertex
protected void encounterVertex(V vertex, E edge)
Description copied from class:CrossComponentIterator
Update data structures the first time we see a vertex.- Specified by:
encounterVertex
in classCrossComponentIterator<V,E,FibonacciHeapNode<ClosestFirstIterator.QueueEntry<V,E>>>
- Parameters:
vertex
- the vertex encounterededge
- the edge via which the vertex was encountered, or null if the vertex is a starting point- See Also:
CrossComponentIterator.encounterVertex(Object, Object)
-
encounterVertexAgain
protected void encounterVertexAgain(V vertex, E edge)
Override superclass. When we see a vertex again, we need to see if the new edge provides a shorter path than the old edge.- Specified by:
encounterVertexAgain
in classCrossComponentIterator<V,E,FibonacciHeapNode<ClosestFirstIterator.QueueEntry<V,E>>>
- Parameters:
vertex
- the vertex re-encounterededge
- the edge via which the vertex was re-encountered
-
provideNextVertex
protected V provideNextVertex()
Description copied from class:CrossComponentIterator
Returns the vertex to be returned in the following call to the iteratornext
method.- Specified by:
provideNextVertex
in classCrossComponentIterator<V,E,FibonacciHeapNode<ClosestFirstIterator.QueueEntry<V,E>>>
- Returns:
- the next vertex to be returned by this iterator.
- See Also:
CrossComponentIterator.provideNextVertex()
-
assertNonNegativeEdge
private void assertNonNegativeEdge(E edge)
-
calculatePathLength
private double calculatePathLength(V vertex, E edge)
Determine weighted path length to a vertex via an edge, using the path length for the opposite vertex.- Parameters:
vertex
- the vertex for which to calculate the path length.edge
- the edge via which the path is being extended.- Returns:
- calculated path length.
-
checkRadiusTraversal
private void checkRadiusTraversal(boolean crossComponentTraversal)
-
createSeenData
private FibonacciHeapNode<ClosestFirstIterator.QueueEntry<V,E>> createSeenData(V vertex, E edge)
The first time we see a vertex, make up a new heap node for it.- Parameters:
vertex
- a vertex which has just been encountered.edge
- the edge via which the vertex was encountered.- Returns:
- the new heap node.
-
-