crosscomponentiterator.java
来自「JAVA图论的算法包。用过觉得还不错」· Java 代码 · 共 571 行 · 第 1/2 页
JAVA
571 行
* null</code>.
*/
protected D getSeenData(V vertex)
{
return seen.get(vertex);
}
/**
* Determines whether a vertex has been seen yet by this traversal.
*
* @param vertex vertex in question
*
* @return <tt>true</tt> if vertex has already been seen
*/
protected boolean isSeenVertex(Object vertex)
{
return seen.containsKey(vertex);
}
/**
* Called whenever we re-encounter a vertex. The default implementation does
* nothing.
*
* @param vertex the vertex re-encountered
* @param edge the edge via which the vertex was re-encountered
*/
protected abstract void encounterVertexAgain(V vertex, E edge);
/**
* Stores iterator-dependent data for a vertex that has been seen.
*
* @param vertex a vertex which has been seen.
* @param data data to be associated with the seen vertex.
*
* @return previous value associated with specified vertex or <code>
* null</code> if no data was associated with the vertex. A <code>
* null</code> return can also indicate that the vertex was explicitly
* associated with <code>null</code>.
*/
protected D putSeenData(V vertex, D data)
{
return seen.put(vertex, data);
}
/**
* Called when a vertex has been finished (meaning is dependent on traversal
* represented by subclass).
*
* @param vertex vertex which has been finished
*/
protected void finishVertex(V vertex)
{
if (nListeners != 0) {
fireVertexFinished(createVertexTraversalEvent(vertex));
}
}
// -------------------------------------------------------------------------
/**
* @param <V>
* @param <E>
* @param g
*
* @return TODO Document me
*/
static <V, E> Specifics<V, E> createGraphSpecifics(Graph<V, E> g)
{
if (g instanceof DirectedGraph) {
return new DirectedSpecifics<V, E>((DirectedGraph<V, E>) g);
} else {
return new UndirectedSpecifics<V, E>(g);
}
}
private void addUnseenChildrenOf(V vertex)
{
for (E edge : specifics.edgesOf(vertex)) {
if (nListeners != 0) {
fireEdgeTraversed(createEdgeTraversalEvent(edge));
}
V oppositeV = Graphs.getOppositeVertex(graph, edge, vertex);
if (isSeenVertex(oppositeV)) {
encounterVertexAgain(oppositeV, edge);
} else {
encounterVertex(oppositeV, edge);
}
}
}
private EdgeTraversalEvent<V, E> createEdgeTraversalEvent(E edge)
{
if (isReuseEvents()) {
reusableEdgeEvent.setEdge(edge);
return reusableEdgeEvent;
} else {
return new EdgeTraversalEvent<V, E>(this, edge);
}
}
private VertexTraversalEvent<V> createVertexTraversalEvent(V vertex)
{
if (isReuseEvents()) {
reusableVertexEvent.setVertex(vertex);
return reusableVertexEvent;
} else {
return new VertexTraversalEvent<V>(this, vertex);
}
}
private void encounterStartVertex()
{
encounterVertex(startVertex, null);
startVertex = null;
}
//~ Inner Interfaces -------------------------------------------------------
static interface SimpleContainer<T>
{
/**
* Tests if this container is empty.
*
* @return <code>true</code> if empty, otherwise <code>false</code>.
*/
public boolean isEmpty();
/**
* Adds the specified object to this container.
*
* @param o the object to be added.
*/
public void add(T o);
/**
* Remove an object from this container and return it.
*
* @return the object removed from this container.
*/
public T remove();
}
//~ Inner Classes ----------------------------------------------------------
/**
* Provides unified interface for operations that are different in directed
* graphs and in undirected graphs.
*/
abstract static class Specifics<VV, EE>
{
/**
* Returns the edges outgoing from the specified vertex in case of
* directed graph, and the edge touching the specified vertex in case of
* undirected graph.
*
* @param vertex the vertex whose outgoing edges are to be returned.
*
* @return the edges outgoing from the specified vertex in case of
* directed graph, and the edge touching the specified vertex in case of
* undirected graph.
*/
public abstract Set<? extends EE> edgesOf(VV vertex);
}
/**
* A reusable edge event.
*
* @author Barak Naveh
* @since Aug 11, 2003
*/
static class FlyweightEdgeEvent<VV, localE>
extends EdgeTraversalEvent<VV, localE>
{
private static final long serialVersionUID = 4051327833765000755L;
/**
* @see EdgeTraversalEvent#EdgeTraversalEvent(Object, Edge)
*/
public FlyweightEdgeEvent(Object eventSource, localE edge)
{
super(eventSource, edge);
}
/**
* Sets the edge of this event.
*
* @param edge the edge to be set.
*/
protected void setEdge(localE edge)
{
this.edge = edge;
}
}
/**
* A reusable vertex event.
*
* @author Barak Naveh
* @since Aug 11, 2003
*/
static class FlyweightVertexEvent<VV>
extends VertexTraversalEvent<VV>
{
private static final long serialVersionUID = 3834024753848399924L;
/**
* @see VertexTraversalEvent#VertexTraversalEvent(Object, Object)
*/
public FlyweightVertexEvent(Object eventSource, VV vertex)
{
super(eventSource, vertex);
}
/**
* Sets the vertex of this event.
*
* @param vertex the vertex to be set.
*/
protected void setVertex(VV vertex)
{
this.vertex = vertex;
}
}
/**
* An implementation of {@link Specifics} for a directed graph.
*/
private static class DirectedSpecifics<VV, EE>
extends Specifics<VV, EE>
{
private DirectedGraph<VV, EE> graph;
/**
* Creates a new DirectedSpecifics object.
*
* @param g the graph for which this specifics object to be created.
*/
public DirectedSpecifics(DirectedGraph<VV, EE> g)
{
graph = g;
}
/**
* @see CrossComponentIterator.Specifics#edgesOf(Object)
*/
public Set<? extends EE> edgesOf(VV vertex)
{
return graph.outgoingEdgesOf(vertex);
}
}
/**
* An implementation of {@link Specifics} in which edge direction (if any)
* is ignored.
*/
private static class UndirectedSpecifics<VV, EE>
extends Specifics<VV, EE>
{
private Graph<VV, EE> graph;
/**
* Creates a new UndirectedSpecifics object.
*
* @param g the graph for which this specifics object to be created.
*/
public UndirectedSpecifics(Graph<VV, EE> g)
{
graph = g;
}
/**
* @see CrossComponentIterator.Specifics#edgesOf(Object)
*/
public Set<EE> edgesOf(VV vertex)
{
return graph.edgesOf(vertex);
}
}
}
// End CrossComponentIterator.java
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?